在过去的2周中,我一直在研究此解决方案,但没有成功。谁能告诉我我要去哪里错了?对于身份验证,我使用express-graphql,express-jwt进行身份验证[后端-[节点,express-graphql,express-jwt,graphql-tools],前端-[React-hooks,graphql-hooks]]。在我用于身份验证之后
const authMiddleware = jwt({
secret: app.get("getsecretval"),
credentialsRequired: false,
getToken: function fromHeaderOrQuerystring(req) {
if (
req.headers.authorization &&
req.headers.authorization.split(" ")[0] === "Bearer"
) {
return req.headers.authorization.split(" ")[1];
} else if (req.query && req.query.token) {
return req.query.token;
}
return null;
}
});
app.use(authMiddleware);
app.use(
"/graphqlAPIRoute",
bodyParser.json(),
authMiddleware,
ExpressGraphQLHTTP(req => ({
schema: Schema,
rootValue: global,
context: {
user: req.user
}
}))
);
//模式-放在authMiddleware之上
这甚至在不存在授权标头的情况下也有效,例如,如果应用程序以登录状态闲置,因为令牌存储在本地存储中,并且未传递标头,但服务器代码执行并获取了数据。不能是这种情况,并且必须抛出认证错误。如果我添加jwt验证,因为没有标题,我们将无法登录。
我认为auth中间件无法正常工作,并且在哪里放置jwt-verify函数以验证令牌。对于Jwt验证令牌,我正在使用
const jwtverify = require('jsonwebtoken');
express-jwt中的Coz,我发现没有这样的功能
任何人都可以让我知道我要去哪里了吗?任何帮助将不胜感激。
这行不通吗?
答案 0 :(得分:1)
index.js - 代码顺序很重要
const authMiddleware = jwt({
secret: "place secret here either pass as env",
credentialsRequired: false,
)}
app.use(authMiddleware);
const context = async (req) => {
const { authorization: token } = req.headers;
return { token };
};
app.use(
"/graphqlAPIRoute",
bodyParser.json(),
authMiddleware,
ExpressGraphQLHTTP(req => ({
schema: Schema,
rootValue: global,
}))
context: () => context(req),
);