📅  最后修改于: 2023-12-03 15:41:08.973000             🧑  作者: Mango
JWT 全称为 JSON Web Token,是一种用于身份验证和授权的开放标准(RFC 7519)。它是一种安全的、轻量级的跨域身份验证方式,可以在不需要再次查询数据库的情况下,直接从服务端验证数据的真实性和有效性。
一个 JWT 包含三个部分:Header、Payload、Signature。
Header 通常由两部分组成:令牌的类型和加密算法。例如:
{
"alg": "HS256",
"typ": "JWT"
}
其中 alg
表示加密算法,typ
表示令牌的类型。
Payload 是 JWT 中真正包含信息的部分,通常可以包含用户的 id、角色、权限等信息。例如:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
在 Payload 中可以自定义添加自己需要的信息。
Signature 是最后一部分,主要是用于验证令牌的真实性,由 Header、Payload 和 Secret Key 三部分组成,例如:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
其中,base64UrlEncode()
表示对 JSON 进行加密后再进行 URL 安全的 Base64 编码。
下面我们基于 Node.js 来实现一个简单的 JWT 鉴权验证流程。
首先我们需要安装两个库:
npm install --save jsonwebtoken express
然后是我们的代码实现:
const express = require('express')
const jwt = require('jsonwebtoken')
const app = express()
app.get('/api/login', (req, res) => {
// 用户登录成功后,生成一个 JWT
const token = jwt.sign({ id: '123456' }, 'my_secret_key')
// 返回 JWT
res.json({ token })
})
// JWT 中间件,用于鉴权
const auth = (req, res, next) => {
const token = req.headers.authorization
try {
// 验证 JWT
const decoded = jwt.verify(token, 'my_secret_key')
// 验证成功,将用户信息存储在 req 上,方便后续使用
req.user = decoded
next()
} catch (err) {
// 验证失败,返回错误信息
res.status(401).json({ message: 'Authentication failed' })
}
}
app.get('/api/userinfo', auth, (req, res) => {
// 获取当前用户信息
const user = req.user
res.json(user)
})
app.listen(3000, () => console.log('Server started on http://localhost:3000'))
以上就是一个简单的 JWT 鉴权验证流程,其中重点是使用 jsonwebtoken
库来生成和验证 JWT。在实际使用过程中,需要注意生成和存储 Secret Key 的安全性,以及 JWT 过期时间等问题。