egg-jwt登录验证生成token
egg-jwt 是一个生成token的插件
token的规则:
服务器返回的token数据基本结构是 Header.Payload.Signature, header、payload、signature三部分以'.'隔开。
例如:
1
2
3
|
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJ1c2VyTmFtZSI6ImNlc2hpemhhbmdodTAyIiwiaWF0IjoxNTU1MjEyMzg1LCJleHAiOjE1NTUyMTU5ODV9. K53kd6cERhp6H4mtd8jCzA2bQtJTsdA2Kh3hzbXMXbU |
header: 一个json对象,描述JWT的元数据
payload: 一个 JSON 对象,用来存放实际需要传递的数据
signature: 对header和payload两部分的签名,防止数据被篡改
安装:
npm i egg-jwt --save // 或 yarn add egg-jwt
导入到egg项目里:
// 在config/plugin.js里面添加 exports.jwt = { enable: true, package: 'egg-jwt', }, // 或者,在config/plugin.js的module.exports里面添加 jwt: { enable: true, package: 'egg-jwt', },
配置:
// 在config/config.default.js的module.exports里面添加 config.jwt = { secret: '123456', };
通过 jwt 生成 token:
app/controller/user.js
// 登录 async login() { const { ctx, app } = this; // post请求传来的参数 const { name } = ctx.request.body; // 判断数据库里面是否存在该用户 const user = await ctx.service.user.login(name); if(user){ // 用户存在,生成token const token = app.jwt.sign({ name: user.name, }, app.config.jwt.secret); ctx.body = { code: 200, message: '登录成功', data: { id: user.id }, token } } }
配置需要鉴权(校验token)的路由
app/router.js
'use strict'; /** * @param {Egg.Application} app - egg application */ module.exports = app => { const { router, controller, jwt } = app; router.post('/user/register', controller.user.register); router.post('/user/login', controller.user.login); // 添加日志 需要鉴权 router.post('/diary/add', jwt, controller.diary.add); };
前端页面调用方式更改:
// 新增日志 axios.post('http://127.0.0.1:7001/diary/add', fieldsValue) .then((res) => { const { data } = res; if(data.code === 200){ message.success(data.message || '操作成功'); }else{ message.error(data.message || '操作失败'); } }) .catch((err) => { console.log(err); })
改为
// 添加日志 let token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiMTIzIiwiaWF0IjoxNTgzODM5NDk5fQ.aqKI-IN9Os0v197FMKLoJzihg7UrjgMS1s-cWWt7KSM'; axios({ method: 'post', url: 'http://127.0.0.1:7001/diary/add', data: fieldsValue, headers: { Authorization: `Bearer ${token}` } }) .then((res) => { const { data } = res; if(data.code === 200){ message.success(data.message || '操作成功'); }else{ message.error(data.message || '操作失败'); } }) .catch((err) => { console.log(err); })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2018-09-30 jquery操作iframe的方法:父页面和子页面相互操作的方法