📜  应设置 express-jwt 错误算法 - Javascript (1)

📅  最后修改于: 2023-12-03 15:09:47.918000             🧑  作者: Mango

应设置 express-jwt 错误算法 - Javascript

引言

在开发中使用 JWT(JSON Web Tokens)对用户进行身份验证和授权是非常常见的,特别是在 Node.jsExpress 的应用程序中。 express-jwt 是一个非常受欢迎的 Node.js 模块,它可以轻松地让应用程序使用 JWT 进行身份验证和授权。

但是,在使用 express-jwt 时,可能会遇到使用不当而产生漏洞,恶意用户可以使用伪造的 JWT 进行身份认证。 因此,我们需要设置适当的错误算法以防止此类攻击。

确认问题

要确定是否存在问题,需要检查应用程序是否在通过 express-jwt 身份验证时进行了 token 签名验证。

以下是在 Express 中使用 express-jwt 的示例代码

const express = require('express');

const app = express();

const jwt = require('express-jwt');
const jwksRsa = require('jwks-rsa');

const checkJwt = jwt({
  // 这里是 jwks-rsa 配置
  secret: jwksRsa.expressJwtSecret({
    cache: true,
    rateLimit: true,
    jwksRequestsPerMinute: 5,
    jwksUri: 'https://yourdomain.auth0.com/.well-known/jwks.json'
  }),

  // 验证 JWT 是否有效
  audience: 'https://yourdomain.api.com',
  issuer: 'https://yourdomain.auth0.com/',
  algorithms: ['RS256']
});

app.get('/protected', checkJwt, (req, res) => {
  res.send('This is protected information');
});

app.listen(3000);

在此示例中,我们定义了一个称为 checkJwt 的中间件函数,该函数使用 jwks-rsa 模块从远程 JWKS(JSON Web Key Set) 获取密钥。 相当于验证了 jwt headerjwt payload 的有效性。 然而,此处并没有对 JWT signature 进行验证,这使得攻击者可以通过伪造 JWT signature 来绕过身份验证。

所以这里我们需要设置符合标准的错误算法以避免此类攻击。

解决方案

在使用 express-jwt(和 jwks-rsa)时,必须按照以下方式配置错误算法:

const jwt = require('express-jwt');
const jwksRsa = require('jwks-rsa');

const checkJwt = jwt({
  // 这里是 jwks-rsa 配置
  secret: jwksRsa.expressJwtSecret({
    cache: true,
    rateLimit: true,
    jwksRequestsPerMinute: 5,
    jwksUri: 'https://yourdomain.auth0.com/.well-known/jwks.json'
  }),

  // 验证 JWT 是否有效
  audience: 'https://yourdomain.api.com',
  issuer: 'https://yourdomain.auth0.com/',
  algorithms: ['RS256'],

  // 添加对签名的验证
  credentialsRequired: true,
  // 默认使用 RS256 签名算法,如果使用其他算法,则需要在此处指定算法。
  // 这里使用两种算法:HS256 和 RS256
  // 如果你使用了其他算法,请添加到数组中
  // 注意:指定错误的算法将使签名验证失败!
  algorithms: ['HS256', 'RS256']
});

如上代码所示,最好的方式是在 jwt 配置中将 credentialsRequired 设置为 true。 这告诉 express-jwt 只有在已验证 JWT signature 时才允许通过。 这将解决伪造 JWT signature 的漏洞。

请注意,在 jwt 配置中指定错误的算法将使签名验证失败,这将允许所有 JWT token 访问你的网站,因此务必非常小心。

结论

在使用 Node.jsExpress 的应用程序中使用 JWT 进行身份验证和授权是非常常见的,但是 express-jwt 等模块如果没有适当的设置,会导致伪造 JWT 的漏洞。 因此,我们必须在 jwt 配置中正确设置错误算法。