一、什么是JWT
JWT全称是jsonwebtoken,JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源
二、JWT的构成
第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature).
image.png
三、如何应用
如何应用
一般是在请求头里加入Authorization,并加上Bearer标注:
fetch('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})
服务端会验证token,如果验证通过就会返回相应的资源。整个流程就是这样的:
image.png
在Node.js中应用
一、首先下载依赖
npm i jsonwebtoken --save
二、引入jsonwebtoken
const jsonwebtoken = require("jsonwebtoken")
三、登录并使用JWT签名并返回token
async login(ctx) {
ctx.verifyParams({
username: {type: 'string', required: false},
password: {type: 'string', required: false}
})
const {username} = ctx.request.body
const user = await User.findOne({username})
if(!user){
ctx.throw(401,"账号或者密码错误")
}else{
const {_id,username} = user
const token = jsonwebtoken.sign({_id,username},secret,{expiresIn:'1d'})
ctx.body = {token}
}
}
四、写一个中间件,这个中间件用来验证token和密钥是否正确,最后引入在路由中
const auth = async (ctx,next) => {
const {token = ''} = ctx.request.header
const tk = token.replace('Bearer ',"")
try {
const user = jsonwebtoken.verify(tk,secret)
ctx.state.user = user
}catch (e) {
ctx.throw(401,'没有权限')
}
await next()
}
router.patch('/',auth,update)









网友评论