前言
写之前最好了解一下jwt,jwt主要用于标识用户,通俗来讲就是让服务端知道哪个用户调用接口。可以自己百度了解相关介绍,这个总结还不错,推荐:https://blog.51cto.com/13914991/2175562。使用时,一般都会把它封装成一个方法作为中间件来使用。如果还不知道什么是中间件就去egg官网看看。
安装
进去项目目录运行命令:npm install jsonwebtoken
使用
它的工作流程大概:登录时,先标识客户端,将用户需要保存的信息和自己定义的密钥字符串,通过算法得到很长的token字符串返回给用户。客户端调用其他接口时,将该token放到请求头(前后端协商)去调用接口。后端拿到token时,就解密,如果服务端没有标识或者该token过期时会发生异常,通过异常来返回提示客户端。
登录方法里调用,当用户登录时,账号密码正确就生成token,返回给客户端:
function loginToken(data, expires = 7200) { // 7200默认时间 const token = jwt.sign(data , '自定义密钥字符串', { expiresIn: expires }); data为用户信息或自己想要保存的信息 return token;}
data 如: { userId: 1, userName: '小缘'}在middleware目录建一个文件: jwt.ts
import jwt = require('jsonwebtoken');
module.exports = () => { return async function authToken(ctx, next) { const authToken = ctx.header.authorization;//获取请求头的token if (authToken) { try { await jwt.verify(authToken, '自定义密钥字符串'); //此处可以 await next(); } catch (error) { if (error.name === 'TokenExpiredError') { ctx.body = { code: '50001', msg: '登录状态已过期' }; } } } else { ctx.body = { code: '50008', msg: '请登陆后再进行操作' }; } };};然后在router.ts里面使用,或者在config.default.ts里面设置全局中间件
const jwt = app.middleware.jwt({}, app);
router.post('url地址', jwt, controller.方法);最后
小缘也是刚开始接触不久,写一下总结希望对有需要的道友有所帮助,有什么问题希望各位指出,一起摸鱼。后面会继续更新关于egg的摸鱼经历。