1.了解session认证的局限性
session认证机制需要配合cookie才能实现,由于cookie默认不支持跨域访问。所以,当涉及到前端跨域请求后端接口的时候,需要做很多额外的配置,才能实现跨域session认证。
注意:
- 当前端请求后端接口不存在跨域问题的时候,推荐使用session认证机制
- 当前端需要跨域请求后段接口的时候,不推荐使用 Session身份认证机制,推荐使用JWT认证机制
2.什么是JWT
JWT(英文全称:JSON Web Token) 是目前最流行的跨域认证解决方案
3.JWT的三个部分各自代表的含义:
jwt第三个组成部分,从前到后分别是:Header Payload Signature
其中
-
payload部分 才是真正的用户信息,它是用户信息经过加密之后生成的字符串
-
header 和 signature 是安全性相关的部分,只是为了保证Token的安全性
4.JWT的使用方式
客户端收到服务器返回的JWT之后,通常会将它存储在localStorage或sessionStorage中 此后,客户端每次与服务器通信,都要带上这个JWT的字符串,从而进行身份认真,推荐的做法是把**JWT放在HTTP请求头的Authorization字段中:*
Authorization:earer <token>
5.安装JWT相关的包
npm install jsonwebtoken express-jwt
其中:
- jsonwebtoken用于生成JWT字符串
- express-jwt用于将JWT字符串解析还原成JSON对象
6.导入JWT相关的包
使用require()函数,分别导入JWT相关的两个包
//导入用于生成JWT字符串的包
const jwt=require('jsonwebtoken');
// 导入用于将客户端发送过来的JWT字符串,解析还原成JSON对此昂的包
const expressJWT=require('express-jwt')
7.定义 secret密钥
为了保证JWT字符串的安全性,防止JWT字符串在网络传输过程中被人破解,我们需要专门定义一个加密和解密的secret密钥:
- 当生成JWT字符串的时候,需要使用secret密钥对用户的信息进行加密,最终得到加密的JWT字符串
- 当把jwt字符串解析还原成json对象的时候,需要使用secret密钥进行解密
//secret密钥的本质:就是一个字符串
const secretKey="it study ^_^"
8.将JWT字符串还原为JSON对象
客户端每次访问那些有权限接口的时候,都需要主动通过请求头的Authorization字段,将Token字符串发送到服务器进行身份认证 此时:服务器可以通过express-jwt这个中间件,自动将客户端发送过来的Token解析还原成JSON对象
//使用app.use()来注册中间件
//expressJWT({secret:secretKey})就是用来解析Token的中间件
//.unless({path:[/^\/api\//]}) 用来访问那些接口不需要访问权限
app.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}))
9.使用req.user获取用户信息
当express-jwt这个中间件配置成功后,即可在那些有权限的接口中,使用req.user对象,来访问从JWT字符串中解析出来的用户信息了
//这是一个由权限的API接口
app.get('/admin/getinfo',function(req,res){
console.log(req.user);
res.send({
status:200,
message:'获取用户信息成功',
data:req.user
})
})