📅  最后修改于: 2023-12-03 14:41:04.739000             🧑  作者: Mango
express-jwt
是 Node.js 中一个中间件模块,用于验证由 JSON web token (JWT) 保护的路由。它是 jsonwebtoken
模块的一个包装器,用于与 Express 网络应用程序框架一起使用。
使用 npm 安装 express-jwt
:
npm i express-jwt
express-jwt
可以使用一个 secret 或公钥来对 token 进行签名和验证。我们可以将签名密钥或公钥作为一个环境变量或配置文件中的一个选项传递。这个 secret 或公钥应该是任意的字符串或 Buffer 对象。
以 secret 为例,创建一个 .env 文件保存 SECRET 环境变量:
echo 'SECRET=mysecret' > .env
在 Express 应用程序代码中,添加如下配置代码:
require('dotenv').config() // 载入环境变量
const express = require('express')
const jwt = require('express-jwt')
const app = express()
app.use(jwt({ secret: process.env.SECRET }))
如果您想在特定路由上启用验证,请在路由处理程序之前添加 jwt
中间件,并指定一个传递给 JWT 的配置参数对象:
app.get('/protected',
jwt({ secret: process.env.SECRET }),
(req, res) => {
// 处理受保护的逻辑
res.send('Welcome to the protected route!')
}
)
上述代码会使 res.send
执行时,首先通过 jwt
中间件验证 token 的有效性。如果验证成功,则执行受保护代码逻辑,否则返回错误。
签名密钥或公钥的字符串,或一个包含签名密钥或公钥的 buffer。secret 必须是一个 buffer 或字符串类型。如果 secret 是一个 buffer,则它必须是由回调函数返回的异步值。
app.use(jwt({ secret: 'secret' }))
算法数组,可用来指定 token 的签名算法。默认为:HS256、HS384 和 HS512 (即 HMAC SHA 序列)。比如,用 RSA 签名密钥时使用的算法选项:
app.use(jwt({
secret: publicKey,
algorithms: ['RS256']
}))
function 获取从请求中提取出 token 的函数。默认为从 HTTP Authorization header 提取。你可以使用该选项覆盖默认承载 token 的方式:
app.use(jwt({
secret: 'secret',
getToken: (req) => req.query.token
}))
issuer (iss) 原发方
app.use(jwt({
secret: 'secret',
issuer: 'myapp.com'
}))
audience (aud) 接收方
app.use(jwt({
secret: 'secret',
audience: 'myapp.com'
}))
有效时间 (exp) 秒数或时间戳。默认情况下,express-jwt
将检查 exp
数据是否存在,如果已经过期,则返回 401 Unauthorized 响应:
app.use(jwt({
secret: 'secret',
expiresIn: 86400 // 24 hours
}))
当验证失败时,express-jwt
会抛出一个 jsonwebtoken
错误。您可以通过使用以下代码片段来处理错误:
app.use(function (err, req, res, next) {
if (err.name === 'UnauthorizedError') {
res.status(401).send('invalid token...');
}
});
其中 UnauthorizedError
是由 jsonwebtoken
模块接口返回的错误类型之一。在这个错误类型的实例中,您可以通过 message
属性访问有关 JWT 验证失败的详细信息。
express-jwt
提供了一种可靠的方式来在 Express 应用程序中实施令牌验证。使用上述配置参数还可以更好地控制实现 JWT 验证的方式。