在网上进行一些搜索之后,我发现使用GraphQL时JWT身份验证的最佳方法是将JWT令牌插入到GraphQL上下文中。通过这样做,解析器可以访问它并检查用户是否已登录,具有权限等。
我想知道是否需要将身份验证逻辑/功能放入需要身份验证的每个解析程序中。有没有一种方法可以默认设置(例如中间件)对每个查询的身份验证,除了登录/注销/注册/忘记密码?
答案 0 :(得分:2)
这个问题经常出现,但还不够讨论。我认为答案不在于技术,而在于哪种方式最适合您的需求。
采用GraphQL时要注意;
以下是基于我实施GraphQL的经验的一些建议
对于登录/退出/忘记密码和整个shebang,考虑去老派。表单Post + Server端呈现,REST API几十年来一直很好。许多第三方身份验证服务都基于此(Facebook登录,Google,OAuth2等)。我倾向于避免使用GraphQL来实现此目的。
检查请求者是否授权访问GraphQL的逻辑可以推广到2个级别
基本上,您检查请求者是否有权使用GraphQL服务。通常,检查请求者是否经过身份验证更容易,否则完全拒绝访问服务。这通常通过Web服务器中间件完成。
有时您需要向匿名用户公开一些GraphQL查询,而我倾向于倾向于使用另一个“不受限制的”GraphQL端点。此端点往往几乎没有突变,暴露有限的信息子集和受限制的嵌套查询。
基本上,您查看数据并确定哪些信息/操作是公开的,哪些不是。 IMO比单个GraphQL端点和在每个查询路径/解析器中实现授权检查点更容易管理和保护。
基本上,在此阶段,所有请求者都是经过身份验证的用户。我们可能需要提问:
这是将检查逻辑放在解析器(或模型)中真正有意义的地方。我个人认为解析器是一个很好的地方。与DataLoader相结合,实施仍然可以快速有效。
希望这有帮助!
答案 1 :(得分:0)
无需检查解析器。您可以在服务器端添加中间件。
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.'
});
}
})
试试这个