ExpressGraphql JWT身份验证,不起作用

时间:2020-06-15 07:43:20

标签: node.js graphql jwt-auth express-graphql express-jwt

在过去的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,我发现没有这样的功能

任何人都可以让我知道我要去哪里了吗?任何帮助将不胜感激。

这行不通吗?

1 个答案:

答案 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),
  );