1. JWT认证机制
JWT(英文全称:JSON Web Token)是目前最流行的跨域认证解决方案
1.1JWT
的工作原理
1.2JWT
的组成部分
JWT 通常由三部分组成,分别是
Header(头部)、Payload(有效荷载)、Signature(签名)
。三者之间使用英文的“.”分隔,格式如下:
Header.Payload.Signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNjg5NTg0MDYxLCJleHAiOjE2ODk2NzA0NjF9.PzFskNZr9q9d7eiq_g7UY6TGwRhrd7ZKsZ-y08gzruQ
- Payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串。
- Header 和 Signature 是安全性相关的部分,只是为了保证 Token 的安全性。
1.3 JWT 的使用方式
客户端收到服务器返回的
JWT
之后,通常会将它储存在localStorage
或sessionStorage
中。
此后,客户端每次与服务器通信,都要带上这个 JWT 的字符串,从而进行身份认证。推荐的做法是把 JWT 放在HTTP 请求头
的Authorization
字段中,格式如下:
Authorization: Bearer
2. Express项目中使用JWT
2.1 安装相应的包
npm install express-jwt jsonwebtoken
// jsonwebtoken 用于生成 JWT 字符串
// express-jwt 用于将 JWT 字符串解析还原成 JSON 对象
2.2 登陆成功后生成 JWT字符串
// 1. 导入相应的模服务器托管网块
const jwt = require('jsonwebtoken');
const expressJWT = require('express-jwt');
// 2. 定义密钥
//为了保证 JWT 字符串的安全性,防止 JWT 字符串在网络传输过程中被别人破解,我们需要专门定义一个用于加密和解密的 secret 密钥:
// 当生成 JWT 字符串的时候,需要使用 secret 密钥对用户的信息进行加密,最终得到加密好的 JWT 字符串
// 当把 JWT 字符串解析还原成 JSON 对象的时候,需要使用 secret 密钥进行解密
const secretKey = 'bufan';
// 登录接口
app.post('/api/login',(req, res)=>{
const userinfo = req.body;
// 登陆成功 ,生成 加密的token字符串
// jwt.sign() 三个参数: 用户信息对象,加密密钥,配置对象
let token = jwt.sign({username:userinfo.username}, secretKey, {expiresIn:'30s'});
//响应给客户端
res.send({
status:0,
msg:'登陆成功',
token
})
})
2.3 解析 JWT字符串
客户端每次在访问那些
有权限接口
的时候,都需要主动通过请求头中的 Authorization 字段
,将Token 字符串
发送到服务器进行身份认证。此时,服务器可以通过express-jwt
这个中间件,自动将客户端发送过来的 Token 解析还原成 JSON 对象
//
// expressJWT({ secret: secretKey }) 解析token的中间件
// .unless({ path:[/^/api//] }) 指定哪些接口不需要该中间件作用
app.use(expressJWT({ secret: secretKey }).unless({ path:[/^/api//]}))
当express-jwt这个中间件配置成功之后,即可在那些有权限的接口中,使用
req.user
对象,来访问从JWT 字符串中解析出来的用户信息了
app.get('/admin/getinfo', (req, res)=>{
console.log(req服务器托管网.user);
res.send({
status:200,
msg:'获取用户信息成功',
data:req.user
})
})
2.4 捕获JWT认证失败的错误
当使用express-jwt解析Token 字符串时,如果客户端发送过来的Token 字符串过期或不合法,会产生一个解析失败的错误,影响项目的正常运行。我们可以通过
Express 的错误中间件
,捕获这个错误并进行相关的处理
app.use((err, req, res, next)=>{
// token解析失败导致的错误
if(err.name == 'UnauthorizedError'){
return res.send({
status:401,
message:'无效的token'
})
}
//其他错误
res.send({
status:500,
message:'未知错误'
})
})
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net