【发布时间】:2016-12-13 14:02:38
【问题描述】:
如何正确处理 GraphQL 服务器中的身份验证?
可以在查询/变异请求的 Authorization 标头中传递 JWT 令牌吗?
我应该使用 GraphQL 规范中的东西吗?
无状态解决方案更可取。
谢谢。
【问题讨论】:
标签: authentication graph authorization jwt
如何正确处理 GraphQL 服务器中的身份验证?
可以在查询/变异请求的 Authorization 标头中传递 JWT 令牌吗?
我应该使用 GraphQL 规范中的东西吗?
无状态解决方案更可取。
谢谢。
【问题讨论】:
标签: authentication graph authorization jwt
前段时间我也在想同样的事情, 但显然身份验证超出了 GraphQL 试图完成的范围(参见 Github 上的对话)。
但是有一些解决方案,例如this,可以通过会话来处理它。
假设您使用express-graphql,您可以执行以下操作。
import graphQLHTTP from 'express-graphql'
app.use(`/graphql`, [aValidationFunction, graphQLHTTP(options)])
function aValidationFunction(req, res, next) {
const { authorization } = req.headers
// Do your validation here by using redis or whatever
if (validUser) {
return next()
} else {
return res.status(403)
}
}
【讨论】:
这取决于您的 GraphQL 使用者是网络应用还是移动应用。
如果它是一个 web 应用程序,那么我建议坚持使用基于 session-cookie 的身份验证,因为大多数流行的 web 框架都支持这一点,并且您还可以获得 CSRF 保护。
如果它是一个移动应用程序,那么您将需要 JWT。您可以尝试从登录响应中手动获取 cookie 标头,并将此“cookie”放入您的下一个请求中,但我遇到的问题是某些代理服务器会剥离此“cookie”,从而使您的请求未经身份验证。所以正如你所说,在每个经过身份验证的请求(GraphQL 请求)中包含 JWT 是可行的方法。
【讨论】: