将 JWT RefreshToken 作为 Set-Cookie 发送

Posted

技术标签:

【中文标题】将 JWT RefreshToken 作为 Set-Cookie 发送【英文标题】:Sending JWT RefreshToken as Set-Cookie 【发布时间】:2020-03-12 10:21:27 【问题描述】:

关于将 JWT 刷新令牌设置为 cookie 时正确或错误的简短问题。

如果我的 API 将其响应标头中的 refresh token 发送到 ApolloServer,那么 Set-Cookie 标头将通过我的 Apollo-server 自动传递到客户端(apollo-client)。或者我是否应该期望我的 API 中只有一个正文数据集,包括令牌 + refreshToke,我将通过 apollo-server 中间件提取它作为 cookie 自己附加到客户端响应中。

有什么想法或建议吗?

【问题讨论】:

【参考方案1】:

Cookies 必须由服务器设置。这将使用这样的快速响应对象来完成。确保它可以从您的 gql 上下文中访问。

res.cookie('X-Refresh-Token', refreshToken, 
  maxAge: 900000,    // 15 minutes in milliseconds
  httpOnly: true,    // ensure the cookie will not be exposed
  secure: true,      // set this in production to ensure HTTPS
  sameOrigin: 'none' // set this in production if the server is separate domain
)

然后,您的客户端必须启用凭据。对于 apollo-boost,这将是:

new ApolloClient(
  uri: 'http://localhost:8080',
  credentials: 'include', // 'same-origin' if your server is same domain
)

为了确保 Cookie 在 GraphQL Playground 中传递:

new ApolloServer(
  context: ( req, res ) => ( req, res ),
  playground: 
    settings: 
      'request.credentials': 'include',
    ,
  ,
)

如果您还没有使用它,cookie parser middleware 可能会派上用场。

【讨论】:

那么,x-refresh-token 需要通过 API 与 Set-Cookie 标头一起发送到 apollo-server,然后将其推送到客户端? 基本上,是的。 apollo-server 本质上只是 express 中间件。通过使用快速响应对象,您应该能够像这样设置 cookie。

以上是关于将 JWT RefreshToken 作为 Set-Cookie 发送的主要内容,如果未能解决你的问题,请参考以下文章

如何在客户端 Express 应用程序中处理 jwt 令牌和 refreshtoken?

使用拦截器获取refreshtoken后如何调用相同的请求?

公开refreshtoken API是不是安全

JWT刷新token策略

JWT刷新token策略

refreshToken 端点实现在哪里?