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两部分的签名,防止数据被篡改

安装:

1

2

3

npm i egg-jwt --save

// 或

yarn add egg-jwt

导入到egg项目里:

1

2

3

4

5

6

7

8

9

10

// 在config/plugin.js里面添加

exports.jwt = {

  enable: true,

  package'egg-jwt',

},

// 或者,在config/plugin.js的module.exports里面添加

jwt: {

  enable: true,

  package'egg-jwt',

},

配置:

1

2

3

4

// 在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){// 用户存在,生成tokenconst token = app.jwt.sign({name: user.name,}, app.config.jwt.secret);ctx.body = {code: 200,message: '登录成功',data: { id: user.id },token}}}

添加中间件,以便控制jwt

module.exports = (options, app) => {return async function jwt(ctx, next) {const token = ctx.request.header.authorization;let decode = '';if (token) {try {// 解码tokenconsole.log(token);decode = ctx.app.jwt.verify(token, options.secret);await next();} catch (error) {ctx.status = 401;ctx.body = {code: 1006,message: error.message == 'invalid token' ? 'token无效' : error.message};return;}} else {ctx.status = 401;ctx.body = {code: 1006,message: '没有token'};return;}};
};

配置需要鉴权(校验token)的路由

app/router.js

'use strict';/*** @param {Egg.Application} app - egg application*/module.exports = app => {const { router, controller } = app;const jwt = app.middleware.jwt(app.config.jwt);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);})

注:密码的md5加密及验证

引用:crypto 已存在,不需要再次安装

1

const crypto = require('crypto');

加密:password 需要加密的内容

1

password = crypto.createHash('md5').update(password).digest('hex');

封装:

app/service/user.js

1

2

3

4

// 专门对数据进行md5加密的方法,输入明文返回密文

getMd5Data(data) {

  return crypto.createHash('md5').update(data).digest('hex');

}

使用EggJS开发接口(三)登录验证之egg-jwt 及 crypto加密相关推荐

  1. 使用eggjs开发接口

    使用eggjs开发接口 一.初始化项目结构 1. 创建项目目录 2. 准备工作 2.1 在app目录下创建service文件夹 2.2 在app目录下创建extend文件夹 2.3 在app目录下创建 ...

  2. 【Node.js+koa--后端管理系统】用户登录接口设计 | 登录验证 | 登录返回凭证(令牌)

  3. 数据接口的登录态校验以及JWT

    混合开发的时候是怎么做的 前后端混合开发的时候,用户登录状态的管理一般都是通过session来实现的,原理很简单:用户登录后,服务端将登录用户信息存储到服务器上的特定位置,并生成对应的session ...

  4. Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍

    开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...

  5. 登录验证过程,PC与APP开放登录接口(支持WEB与SDK方式)

    1.需求场景 登录,是一个系统的第一步功能.登录成功后,才能进入系统,使用系统功能.在某些场景下,其它系统需要接入到本系统中.或者通过接口的方式进行登录,以及通过接口的方式来取数据. 另外,系统配套移 ...

  6. Springboot 实现api校验和登录验证

    https://blog.csdn.net/qq_36085004/article/details/83348144 2018年10月24日 17:59:29 PerkinsLi 阅读数:232 文章 ...

  7. Java实现Token登录验证(基于JWT的token认证实现)

    文章目录 一.JWT是什么? 二.使用步骤 1.项目结构 2.相关依赖 3.数据库 4.相关代码 三.测试结果 一.JWT是什么? 在介绍JWT之前,我们先来回顾一下利用token进行用户身份验证的流 ...

  8. Spring Security自定义登录验证及登录返回结果

    Spring Security自定义登录验证及登录返回结果 一.功能描述 二.处理逻辑 简单流程 自定义UserDetails 自定义UserDetailsDAO 自定义UserDetailsServ ...

  9. JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入)

    JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入) 开发流程:需求文档 接口文档 效果图 开发环境统一:JDK1.8 IDEA win10 GIT SSM SSH SpringB ...

最新文章

  1. 安装好Pycharm后如何配置Python解释器简易教程
  2. head在linux命令中什么意思,Linux系统中head命令如何使用
  3. 大样品随机双盲测试_训练和测试样品生成
  4. 【今日CS 视觉论文速览】 24 Dec 2018
  5. Ubuntu安装网易云音乐
  6. Arduino相关语法和函数
  7. Android 实现小红书登陆页面背景图无限滚动效果
  8. c语言英文字母表,26个英文字母表
  9. PyQt5 关于消息盒子QMessageBox 不显示消息盒子且出现内存不足的问题
  10. 在未来税制下个人所得税信息管理系统建设设想
  11. 三国鼎立企查查、天眼查、微猫的三国大战
  12. 华为机试od社招刷题攻略-目录
  13. 先验概率 后验概率 贝叶斯法则 贝叶斯公式
  14. 音视频技术开发周刊 | 274
  15. mysql substr无效_mysql substr()函数用法
  16. C#web弹出提示框的几种方法
  17. 吕本富:中国互联网太乱 完全没有游戏规则
  18. 三点求外接园,同时计算三点的圆弧弧长,以及半径等信息
  19. C/C++ 库函数查询工具MSDN
  20. MYSQL Archive存储引擎

热门文章

  1. 为什么别人不回你的微信?说说如何正确的提问
  2. Word怎么在方框里面打对勾
  3. OSPF——5种报文(图解)
  4. MATLAB仿真节点个数和节点通信半径与网络连通率的关系,WSN实验
  5. html5波浪效果,html5 canvas粒子波浪动画特效
  6. 神威超级计算机配置,神威太湖轻型超级计算机配置和性能列表
  7. 使用弗洛伊德算法(Floyd-Warshall)找到所有对最短路径长度
  8. effective c++ 学习笔记之 Shifting from c to c++
  9. DolphinDB智臾科技CEO周小华:《从反向控制的终极目标谈时序数据库的架构设计》
  10. 货郎担问题(分支限界法)