JWT(JSON Web Token)是目前最流行的跨域认证解决方案。
JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名)
三者之间使用英文的“.”分隔:Header.Payload.Signature
注:
-
Payload部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串
-
Header 和 Signature 是安全性相关的部分,只是为了保证 Token 的安全性
安装:npm i jsonwebtoken express-jwt
// 安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
const jwt = require('jsonwebtoken')
const {expressjwt} = require('express-jwt')
// 定义 secret 密钥,建议将密钥命名为 secretKey
const secretKey = 'why ^_^'
// TODO_03:在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端
// 参数1:用户的信息对象
// 参数2:加密的秘钥
// 参数3:配置对象,可以配置当前 token 的有效期
// 记住:千万不要把密码加密到 token 字符中
const tokenStr = jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '30s' })
res.send({
status: 200,
message: '登录成功!',
token: tokenStr, // 要发送给客户端的 token 字符串
})
// 注册将 JWT 字符串解析还原成 JSON 对象的中间件
// 注意:只要配置成功了 express-jwt 这个中间件,就可以把解析出来的用户信息,挂载到 req.user 属性上
// noPath 为不需要token的地方
const noPath = ['/api/login']
app.use(expressJWT({ secret: secretKey, algorithms: ['HS256']}).unless({ path: noPath }))
// 使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误
app.use((err, req, res, next) => {
// 这次错误是由 token 解析失败导致的(过期或不合法)
if (err.name === 'UnauthorizedError') {
return res.send({
status: 401,
message: '无效的token',
})
}
res.send({
status: 500,
message: '未知的错误',
})
})
用postman进行调试如图
Headers的key值为Authorization value为Bearer token的形式