📅  最后修改于: 2023-12-03 15:09:47.918000             🧑  作者: Mango
express-jwt
错误算法 - Javascript在开发中使用 JWT
(JSON Web Tokens)对用户进行身份验证和授权是非常常见的,特别是在 Node.js
和 Express
的应用程序中。 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 header
和 jwt 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.js
和 Express
的应用程序中使用 JWT
进行身份验证和授权是非常常见的,但是 express-jwt
等模块如果没有适当的设置,会导致伪造 JWT
的漏洞。 因此,我们必须在 jwt
配置中正确设置错误算法。