使用 GraphQL 通过 JWT 进行身份验证
Authentication with JWT using GraphQL
在网上搜索后,我发现使用 GraphQL 时 JWT 身份验证的最佳方式是将 JWT 令牌插入 GraphQL 上下文。通过这样做,解析器可以访问它并检查用户是否登录、是否具有权限等。
我想知道是否需要将身份验证 logic/function 放入每个需要身份验证的解析器中。有没有一种方法可以默认设置(例如中间件)对除 login/logout/register/forgotpasword 之外的每个查询的身份验证?
这个问题经常出现,但讨论得不够多。我认为答案不在于技术,而在于哪种方式最适合您的需求。
采用 GraphQL 时请务必注意;
- 您不必放弃 REST
- 您可以拥有 多个 GraphQL 端点
根据我实施 GraphQL 的经验,这里有一些建议
身份验证
对于 login/logout/forgot 密码和整个 shebang,考虑老派。表单 Post + 服务器端渲染,REST API 为我们服务了几十年。许多第三方身份验证服务都基于此(Facebook 登录、Google、OAuth2...等)。为此,我倾向于避免使用 GraphQL。
授权
检查请求者是否授权访问 GraphQL 的逻辑可以概括为 2 个级别
GraphQL 服务
本质上,您检查请求者是否被授权使用 GraphQL 服务。通常,检查请求者是否经过身份验证更容易,否则将完全拒绝对服务的访问。这通常是通过网络服务器中间件完成的。
有时您需要向匿名用户公开一些 GraphQL 查询,我倾向于拥有另一个 'unrestricted' GraphQL 端点。这个端点往往几乎没有突变,暴露有限的信息子集和受限的嵌套查询。
基本上,您查看数据并决定哪个 information/operation 是 public,哪个不是。在我看来,这比使用单个 GraphQL 端点并在每个查询中实施授权检查点更容易管理和保护 path/resolver。
细粒度授权
现阶段基本上所有的请求者都是认证用户。我们可能需要提问:
- 请求者是否与当前查看其信息的用户相同?
- 请求者是当前查看其信息的用户的朋友吗?
- 请求者是当前查看其信息的公司的成员吗?
这就是将检查逻辑放入解析器(或模型)真正有意义的地方。我个人认为解析器是执行此操作的好地方。加上 DataLoader 实施仍然可以快速有效。
希望对您有所帮助!
无需检查解析器。您可以在服务器端添加一个中间件。
const graphQLServer = express();
graphQLServer.use('/graphql', function(req, res, next) {
var token = req.headers.token;
if (token != null && token != 'undefined') {
//Do token verification here
next();
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
})
试试这个
在网上搜索后,我发现使用 GraphQL 时 JWT 身份验证的最佳方式是将 JWT 令牌插入 GraphQL 上下文。通过这样做,解析器可以访问它并检查用户是否登录、是否具有权限等。
我想知道是否需要将身份验证 logic/function 放入每个需要身份验证的解析器中。有没有一种方法可以默认设置(例如中间件)对除 login/logout/register/forgotpasword 之外的每个查询的身份验证?
这个问题经常出现,但讨论得不够多。我认为答案不在于技术,而在于哪种方式最适合您的需求。
采用 GraphQL 时请务必注意;
- 您不必放弃 REST
- 您可以拥有 多个 GraphQL 端点
根据我实施 GraphQL 的经验,这里有一些建议
身份验证
对于 login/logout/forgot 密码和整个 shebang,考虑老派。表单 Post + 服务器端渲染,REST API 为我们服务了几十年。许多第三方身份验证服务都基于此(Facebook 登录、Google、OAuth2...等)。为此,我倾向于避免使用 GraphQL。
授权
检查请求者是否授权访问 GraphQL 的逻辑可以概括为 2 个级别
GraphQL 服务
本质上,您检查请求者是否被授权使用 GraphQL 服务。通常,检查请求者是否经过身份验证更容易,否则将完全拒绝对服务的访问。这通常是通过网络服务器中间件完成的。
有时您需要向匿名用户公开一些 GraphQL 查询,我倾向于拥有另一个 'unrestricted' GraphQL 端点。这个端点往往几乎没有突变,暴露有限的信息子集和受限的嵌套查询。
基本上,您查看数据并决定哪个 information/operation 是 public,哪个不是。在我看来,这比使用单个 GraphQL 端点并在每个查询中实施授权检查点更容易管理和保护 path/resolver。
细粒度授权
现阶段基本上所有的请求者都是认证用户。我们可能需要提问:
- 请求者是否与当前查看其信息的用户相同?
- 请求者是当前查看其信息的用户的朋友吗?
- 请求者是当前查看其信息的公司的成员吗?
这就是将检查逻辑放入解析器(或模型)真正有意义的地方。我个人认为解析器是执行此操作的好地方。加上 DataLoader 实施仍然可以快速有效。
希望对您有所帮助!
无需检查解析器。您可以在服务器端添加一个中间件。
const graphQLServer = express();
graphQLServer.use('/graphql', function(req, res, next) {
var token = req.headers.token;
if (token != null && token != 'undefined') {
//Do token verification here
next();
} else {
// if there is no token
// return an error
return res.status(403).send({
success: false,
message: 'No token provided.'
});
}
})
试试这个