我正在使用GraphQL Yoga和后端使用Prisma的突变解析器。突变用于进行身份验证,并在成功登录后返回JWT。该突变目前看起来像这样:
loginEmployer: async (_, args, context, info) => {
const employer = await context.prisma.query.employer({
where: {
name: args.name,
}
})
const match = await bcrypt.compare(args.password, employer.hashedPassword);
if (match) {
return jwt.sign(employer, jwtSecret);
} else {
return "";
}
}
该算法非常简单,如您所见:找到具有匹配名称的雇主,使用bcrypt将存储的哈希密码与输入的哈希密码进行比较,如果匹配则返回一个签名的jwt。很标准的东西。
但是在没有匹配项的情况下,或者如果没有与该名称匹配的雇主,我想用403来回答。我只想res.status(403).send({error: "No such username/password"})
做,但使用GraphQL Yoga我有点迷茫,找不到任何有关此操作的文档。
感谢您对我的回答进行梳理或指出正确的方向:)
答案 0 :(得分:2)
棱镜的阿比在这里!
在GraphQL Yoga中,您可以传递一个context
工厂,其中包含请求和响应!
这是一个例子!
new GraphQLServer({
typeDefs,
resolvers,
context: ({ req, res, ...rest }) => {
// pass things down in context!
return { req, res, userId: req.headers.userid };
},
})
然后在您的解析器中,只需将res
从上下文对象中拉出即可。
现在这确实可以正常工作,但是这是一个关于类似问题的github问题,对此有其他一些看法:https://github.com/graphql/express-graphql/issues/71
答案 1 :(得分:1)
@Lars Holdaas之后-我花了很长时间才得出答案。但是上下文参数是request
和response
。
如果使用req / res,则无法使用。举一个更准确的例子:
new GraphQLServer({
typeDefs,
resolvers,
context: ({ request, response, ...rest }) => {
return {
req: request,
res: response,
userId: request.headers.userid
};
},
})