jwt和session二者区别
- session是把身份信息存在服务端的,jwt是存在客户端的
- session有跨域问题,jwt没有跨域问题
jwt即是jsonwebtoken缩写,jwt有三部分组成Header(头部),payload(有效荷载)、signature(签名)。用“ . ”分割,示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiIwMDAwIiwiaWF0IjoxNjY4MTM5NjA0LCJleHAiOjE2NjgxMzk2MzR9.AHk0j0xB8s4BVvaepCxoLhbGPKPcv20pzk5sv9vYE9I
安装(两个包一个是jsonwebtoken加密,一个是express-jwt解密)
npm i jsonwebtoken express-jwt
导入模块
// 导入express模块
const express = require('express')
const jwt = require('jsonwebtoken')
const expressJwt = require("express-jwt")
//解决跨域
const cors = require('cors')
const app = express()
解决跨域问题,及其请求体数据
//调用cors中间件
app.use(cors())
// 使用中间件转换数据
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
使用
全局定义个秘钥
// 定义秘钥
const secretkey = 'wcg'
//使用解密全局中间件
app.use(
//unless默认不校验正则的路径
expressJwt.expressjwt({ secret: secretkey, algorithms: ["HS256"] }).unless({
path: [/^\/admin\//],
})
);
路由实现
app.post('/admin/login', (request, response) => {
if (request.body.username != 'admin' || request.body.password != '0000') {
return response.send({
status: 1,
msg: "登陆失败"
})
}
const userInfo = { username: request.body.username, password: request.body.password }
//用户信息
//加密的秘钥
//配置对象,可以配置token有效期
const tokenstr = jwt.sign(userInfo, secretkey, { expiresIn: '30s' })
response.send({
status: 200,
msg: "登陆成功",
token: tokenstr
})
})
app.get('/api/user', (request, response) => {
response.send({
status: 0,
msg: '登陆成功',
username: request.auth.username
})
})
配置错误中间件解析jwt错误
//错误中间件解析错误
app.use((erro, res, req, next) => {
if (erro.name = 'UnauthorizedError') {
return req.send({
status: 401,
msg: 'token失效'
})
}
return req.send({
status: 500,
msg: '未知的错误'
})
})
app.listen(8899, () => {
console.log('启动成功')
})
操作模式默认是把服务端生成的token,储存到本地localStorage和sessionStorage中,其次每次客户端请求都要带上这个jwt字符,同时要在字符串前面加上Bearer ,默认写法是储存到头部Authorization这个字段中