【问题标题】:UnauthorizedError: invalid algorithm - Node.js express-jwtUnauthorizedError:无效算法 - Node.js express-jwt
【发布时间】:2022-02-25 06:40:53
【问题描述】:

我,尝试对用户进行身份验证,我可以创建一个用户并获取承载,但之后我添加了此代码进行身份验证,它每隔几秒钟就会显示以下错误:

UnauthorizedError: invalid algorithm
    at /mnt/c/Projects/myProject/node_modules/express-jwt/lib/index.js:105:22
    at /mnt/c/Projects/myProject/node_modules/jsonwebtoken/verify.js:121:14
    at getSecret (/mnt/c/Projects/myProject/node_modules/jsonwebtoken/verify.js:90:14)
    at Object.module.exports [as verify] (/mnt/c/Projects/myProject/node_modules/jsonwebtoken/verify.js:94:10)
    at verifyToken (/mnt/c/Projects/myProject/node_modules/express-jwt/lib/index.js:103:13)
    at fn (/mnt/c/Projects/myProject/node_modules/async/lib/async.js:746:34)
    at /mnt/c/Projects/myProject/node_modules/async/lib/async.js:1213:16
    at /mnt/c/Projects/myProject/node_modules/async/lib/async.js:166:37
    at /mnt/c/Projects/myProject/node_modules/async/lib/async.js:706:43
    at /mnt/c/Projects/myProject/node_modules/async/lib/async.js:167:37

代码:

const express = require("express");
const { ApolloServer } = require("apollo-server-express");
const jwt = require("express-jwt");
const typeDefs = require("./settings/schema");
const resolvers = require("./settings/resolvers");
const JWT_SECRET = require("./settings/constants");

const app = express();
const auth = jwt({
    secret: JWT_SECRET,
    credentialsRequired: false,
    algorithms: ['RS256'],
});

app.use(auth);

const server = new ApolloServer({
    typeDefs,
    resolvers,
    playground: {
        endpoint: "/graphql",
    },
    context: ({ req }) => {
        const user = req.headers.user
            ? JSON.parse(req.headers.user)
            : req.user
            ? req.user
            : null;
        return { user };
    },
});

server.applyMiddleware({ app });

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log("The server started on port " + PORT);
});

无法弄清楚为什么“RS256”不是有效算法,我是否需要其他要求?不同的任务需要不同的算法吗?

constants.js 包含以下内容:

const JWT_SECRET = "sdlkfoish23@#$dfdsknj23SD"; 

module.exports = JWT_SECRET;

谢谢

编辑:

我没有使用 Auth0、OAuth 或任何其他服务,我想在这里自己验证用户身份

当一个新用户通过 GraphQL API 添加到数据库 (postgres) 时,我正在注册一个密钥:

mutation {
  register(login: "john", password: "doe")
}

回答:

{
  "data": {
    "register": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NiwibG9naW4iOiJqb2VsIiwiaWF0IjoxNjE0NDM0NzMwLCJleHAiOjE2MTQ0MzQ5MTB9.ALltmClvlzxDJJ2FgZcFzstDUP5CY1xRzs8yQwheEn8"
  }
}

然后我就这样使用这个承载:

// Headers
{
  "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NiwibG9naW4iOiJqb2VsIiwiaWF0IjoxNjE0NDM0NzMwLCJleHAiOjE2MTQ0MzQ5MTB9.ALltmClvlzxDJJ2FgZcFzstDUP5CY1xRzs8yQwheEn8"
}

// Query
query {
  current {
    id,
    login
  }
}

我收到了这个答案(也不知道为什么):

{
  "error": "Unexpected token < in JSON at position 0"
}

以及终端上这篇文章顶部的错误

【问题讨论】:

  • 我不知道这是否会导致错误消息,但是当您使用 RS256 之类的算法(这是一个有效的选择)时,您不能只使用随机的“JWT_SECRET”,您需要一个正确的密钥对,用于签名的私钥和用于验证的公钥。
  • 完全不知道将公共放在哪里,我已经通过寄存器生成了一个承载,所以它必须是公共的,JWT_SECRET 必须是私有的,不是吗?我会查看有关 express-jwt 的文档,看看它是否带来了一些亮点
  • RS256 有一种特殊的格式。在这个Q/A 中,您会看到一个使用私钥/公钥对的示例。您可以使用online generator 创建密钥对。
  • 我试试,谢谢
  • 如果我更改算法以添加 'HS256' 它运行良好,它是 RS256 不工作并且仍然不知道为什么(我搜索了文档等但是....)

标签: node.js express authentication express-jwt


【解决方案1】:

对于带有JWT_SECRET 的不记名令牌,请使用HS256 算法。 RSA256 算法需要公钥和私钥对。

以下代码 sn-p 有效:

const auth = jwt({
    secret: JWT_SECRET,
    credentialsRequired: false,
    algorithms: ['HS256']
});

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 2021-08-21
    • 2019-08-04
    • 2020-04-19
    • 2018-01-26
    • 2019-04-06
    • 2020-02-28
    • 2019-02-24
    • 2018-04-17
    相关资源
    最近更新 更多