什么是JWT
- JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
是一种认证授权机制。 - 三个组成部分:HEADER头部,PAYLOAD载荷(数据username、ID等),VERIFT SIGNATURE签名
- 将客户端的内容进行加密,当每次发请求时,加上token,发给服务器,服务器再进行解密
- 数据存在客户端
JWT原理
JWT认证流程
- 用户输入用户名/密码登录,服务端认证成功后,会返回给客户端一个 JWT
- 客户端将 token 保存到本地(通常使用 localstorage,也可以使用 cookie)
- 当用户希望访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加 JWK.
JWT生成
jwt.io/.
www.jsonwebtoken.io/.
JWT使用方式
生成token:
useCtrl.js:
// 登录
async login(ctx){
// 校验参数
ctx.verifyParams({
username: {type: 'string', required: true},
password: {type: 'password', required: true}
});
// 用户名密码是否正确
const {username, password} = ctx.request.body;
const user = await User.findOne({username, password});
console.log(user);
if(!user){
ctx.throw(401, '用户名或密码错误');
}else{
//登录成功
// 生成token
const token = jwt.sign({ _id: user._id, username: user.username }, secret, { expiresIn: '15d'});
// 将token告诉客户端
ctx.body = { token };
}
};
解密:
法一:自定义解密
useCtrl.js:
async auth(ctx, next){
// 校验用户身份
let token = ctx.request.header['authorization'];
token = token.replace('Bearer ', '');
// 解密jwt
const result = jwt.verify(token, secret);
ctx.state = result;
await next();
};
router/user.js:
//法一:自定义解密,要配合userctrl使用
router.patch('/:id', userCtrl.auth, userCtrl.update);
法二:用插件(koaJWT)
router/user.js:
//插件解密
const koaJWT = require('koa-jwt');
const {secret} = require('../config');
const auth = koaJWT({secret});
//法二:用插件解密
router.patch('/:id', auth, userCtrl.update);