1. token身份认证
1. 介绍:
token身份认证【令牌】是服务端对客户端请求进行身份检查的一种技术;
用户登录成功后,服务端会生成token令牌响应给客户端;客户端后续请求必须携带此token,服务端获取token进行身份认证判断,确定该请求为正确请求后,才响应请求数据。
2. 前端实现思路:
- 用户登录成功,保存服务端响应的token到本地
- 在axios拦截器中设置token到Authorization 请求头
3. 后端实现思路:
- 判断用户登录成功, 生成token令牌, 响应给用户
- 拦截需要身份认证的所有请求,获取客户端发送的Authorization 请求头进行token验证
4. token时序图
5. jwt技术实现token认证技术的一种技术方案
1. 安装
npm i jsonwebtoken
2. 封装生成和认证token代码
3.
const jwt = require('jsonwebtoken') //引入jwt库
const tokenSecrit = 'token-h52203'
const Token = {
/**
* 生成token令牌
* @param {*} data
* @returns
*/
entrypt: function (data) {
return jwt.sign(data, tokenSecrit, { expiresIn: '10h' })
},
/**
* 验证token
* @param {*} token
* @returns
*/
decrypt: function (token) {
try {
let data = jwt.verify(token, tokenSecrit)
return {
token: true,
}
} catch (error) {
return {
token: false,
data:error
}
}
},
}
module.exports = Token
4. 拦截所有请求进行认证
5.
/**
* app.js模块文件中
* token统一认证
*/
app.all('/*',function(req,res,next){
// 如果是登录、注册等不需要认证的接口,直接放行
console.log('req.url ',req.url);
let noAuthor = ['/user/login','/user/register']
if(noAuthor.indexOf(req.url) !== -1){
next() //直接放行
return
}
// token认证
let token = null
// 1. 是否存在token
if(req.headers.authorization){
token = req.headers.authorization
}
// 2. 验证token正确性
let data = jwtToken.decrypt(token)
if(data.token){
next()
}else{
res.send({
code:-1,
message:'token认证失败'
})
}
})
6. 前端需要认证的接口设置头
// 获取登录时保存的token
let tokenStr = localStorage.getItem('TOKEN')
let token = JSON.parse(tokenStr)
axios({
method: 'get',
url: 'http://10.7.173.110:3000/product/list',
headers: { authorization: token }, // token设置
}).then(res => {
let { data } = res
if (data.code == 1) {
let list = data.message.list
showProductList(list)
}
})