📜  express-jwt - Javascript (1)

📅  最后修改于: 2023-12-03 14:41:04.739000             🧑  作者: Mango

使用 express-jwt 权限控制中间件

什么是 express-jwt?

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 的有效性。如果验证成功,则执行受保护代码逻辑,否则返回错误。

配置选项
secret

签名密钥或公钥的字符串,或一个包含签名密钥或公钥的 buffer。secret 必须是一个 buffer 或字符串类型。如果 secret 是一个 buffer,则它必须是由回调函数返回的异步值。

app.use(jwt({ secret: 'secret' }))
algorithms

算法数组,可用来指定 token 的签名算法。默认为:HS256、HS384 和 HS512 (即 HMAC SHA 序列)。比如,用 RSA 签名密钥时使用的算法选项:

app.use(jwt({
  secret: publicKey,
  algorithms: ['RS256']
}))
getToken

function 获取从请求中提取出 token 的函数。默认为从 HTTP Authorization header 提取。你可以使用该选项覆盖默认承载 token 的方式:

app.use(jwt({
  secret: 'secret',
  getToken: (req) => req.query.token
}))
issuer

issuer (iss) 原发方

app.use(jwt({
  secret: 'secret',
  issuer: 'myapp.com'
}))
audience

audience (aud) 接收方

app.use(jwt({
  secret: 'secret',
  audience: 'myapp.com'
}))
expiresIn

有效时间 (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 验证的方式。