egg实践系列 --- jwt的简单使用

961 阅读2分钟

前言

       写之前最好了解一下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的摸鱼经历。