-
工作原理
-
服务端对用户信息进行加密之后保存在客户端,localstorage,sessionstorage等
-
客户端通过请求头的anthorization,将token字符串发送给服务端进行验证
-
服务端认证成功后将内容返回给客户端
-
-
组成含义
-
header(类型/加密算法),payload(信息),siganature(签名).三者之间用.隔开
-
payload是真正用户信息
-
header,siganature是保证token安全性相关的东西
-
-
使用方式
//请求头设置
Authorization:Bearer token
//demo
//生成jwt字符串
const jwt = require('jsonwebtoken')
const express = require('express')
// 新的导入方式,旧版本导入方式有差异
const {expressjwt} = require('express-jwt')
const cors = require('cors')
const app = express()
app.use(express.urlencoded({extended:false}))
app.use(cors())
// expressJWT:解析token成json对象,输出到req.user对象,新版输出到req.auth
// unless:匹配不需要解析的请求
//algorithms: ["HS256"]:加密算法
const secretKey = 'hahaha'
app.use(expressjwt({secret:secretKey,algorithms: ["HS256"]}).unless({path:[/^\/api\//]}))
// 用户信息,秘钥,配置信息
app.post('/api/login',(req,res)=>{
console.log(req.body);
if(req.body.username!=='admin'||req.body.password!=='123'){
return res.send('login fail')
}
res.send({
status:0,
msg:'登录成功',
// expiresIn token的有效时间,不带单位默认为秒 ,带单位: "1 days", "11h"
token:jwt.sign({username:req.body.username},secretKey,{expiresIn:'360s'})
})
})
app.get('/admin/loginInfo',(req,res)=>{
res.send({
status:0,
msg:'请求成功',
data:req.auth
})
})
// const decode = (req)=> {
// const authorization = req.headers.authorization
// let token = ''
// if (authorization.indexOf('Bearer') >= 0) {
// token = authorization.replace("Bearer ","")
// } else {
// token = authorization
// }
// // console.log(token)
// return jwt.verify(token,secretKey,{algorithms: 'HS256'})
// }
// 全局中间件,处理token异常
app.use((err,req,res,next)=>{
console.log(err);
if(err.name=== 'UnauthorizedError'){
return res.send({
status:401,
msg:'无效的token'
})
}
res.send({
msg:'未知错误'
})
})
app.listen(8088,()=>{
console.log('server is running');
})