通过这篇 全栈项目|小书架|服务器开发-JWT 详解 文章我们对JWT有了深入的了解,那么接下来介绍JWT如何在项目中使用。

安装

$ npm install jsonwebtoken

生成 Token

将生成token的代码封装到一个函数中,方便后续调用。

/**
* 生成 token
* @param {用户 id} uid
* @param {*} scope
*/
const generateToken = function (uid, scope) {
// 配置项中的密钥和过期时间
const secretKey = global.config.security.secretKey
const expiresIn = global.config.security.expiresIn // 接收三个参数,第一个是载荷,用于编码后存储在 token 中的数据,也是验证 token 后可以拿到的数据;
// 第二个是密钥,自己定义的,验证的时候也是要相同的密钥才能解码;
// 第三个是options,可以设置 token 的过期时间。
const token = jwt.sign({
uid,
scope
}, secretKey, {
expiresIn: expiresIn
})
return token
}

有些api用户是没权限访问,比如用户只有总管理员可以查看统计数据,而普通用户访问会提示权限不足,如何去实现这个功能呢?

koa是一个中间件框架,那么就可以通过中间件的方式去实现

拦截器中间件

  1. 定义一个中间件
  2. 在接口访问时调用中间件验证

Auth.js权限验证中间件

const basicAuth = require('basic-auth')
const jwt = require('jsonwebtoken') class Auth {
/**
* @param {用户权限等级} level
*/
constructor(level) {
this.level = level || 1
Auth.USER = 8
Auth.ADMIN = 16
Auth.SUPER_ADMIN = 32
} get m() {
return async (ctx, next) => { const userToken = basicAuth(ctx.req)
let errMsg = 'token不合法' if (!userToken || !userToken.name) {
throw new global.errs.Forbidden(errMsg)
}
// 校验 token 令牌
try {
var decode = jwt.verify(userToken.name,
global.config.security.secretKey)
} catch (error) {
if (error.name == 'TokenExpiredError'){
errMsg = 'token已过期'
}
// token不合法
throw new global.errs.Forbidden(errMsg)
} if(decode.scope < this.level){
errMsg = '权限不足'
throw new global.errs.Forbidden(errMsg)
} // uid,scope
ctx.auth = {
uid:decode.uid,
scope:decode.scope
} await next()
}
} } module.exports = {
Auth
}

调用中间件验证权限

router.get('/search/hot',  new Auth().m,async ctx => {
ctx.body = {
'uid':ctx.auth.uid,
'scope': ctx.auth.scope
}
})

ps: new Auth().m 中的m不需要括号,因为是属性,不是方法

验证 Token

通过调用jwt.verify,判断是否出错,没有出错则token有效,否则token无效。

在验证token时就可以获取到携带的数据,有两种方式:

(1)通过 jwt.verify直接返回

(2)通过 jwt.verify保存在ctx.auth然后需要的时候再返回。

方式1:

static verifyToken(token){
try{
let userData = {}
jwt.verify(token, global.config.security.secretKey, (err, data) => {
if(err) {
throw new global.errs.HttpException("验证失败",-1)
} else {
// data 中就包含 jwt.verify 验证通过之后的数据
userData = data
}
})
return userData
}
catch (error){
throw new global.errs.HttpException("验证失败",-1)
} }

方式2:

通过权限验证之后,就可以在接口请求中获取到数据 jwt中携带的数据了。

在获取热搜书籍接口中取出先前传递的uidscope

router.get('/search/hot',  new Auth().m,async ctx => {
ctx.body = {
'uid':ctx.auth.uid,
'scope': ctx.auth.scope
}
})

参考


全栈项目|小书架|服务器开发-NodeJS 使用 JWT 实现登录认证的更多相关文章

  1. 全栈项目|小书架|服务器开发-NodeJS 项目分包

    唠嗑 参考的是慕课网七月老师的课程,七月的课质量真的挺高的,推荐一波.这次的小书架项目源码不会全部公开,因为用了七月老师课程的绝大部分代码.虽然代码不全,但是只要思路看得懂,代码实现就很简单了. 小书 ...

  2. 全栈项目|小书架|服务器开发-NodeJS 中使用 Sequelize 操作 MySQL数据库

    安装 官网:https://sequelize.org/v5/manual/getting-started.html 安装sequelize及数据库连接驱动 npm install --save se ...

  3. 全栈项目|小书架|服务器开发-Koa2 全局异常处理

    什么是异常 做开发的基本都知道异常,像Android开发中常见的ANR异常.空指针异常,服务器开发中经常遇到的异常404,500异常,还有一些其他常见的异常,具体可见HTTP状态码. 基本上这些异常可 ...

  4. 全栈项目|小书架|服务器开发-Koa2中间件机制洋葱模型了解一下

    KOA2 是什么? Koa是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 asyn ...

  5. 全栈项目|小书架|服务器开发-JWT 详解

    JWT 官方简介:Introduction to JSON Web Tokens 文章基本是官网内容的翻译,英文不错的同学可点击上面的链接直接看英文文档. 什么是 JWT JWT全称是JSON Web ...

  6. 全栈项目|小书架|服务器开发-Koa2 连接MySQL数据库(Navicat+XAMPP)

    为什么使用数据库 为什么需要数据库?-知乎 相比与文件系统,数据库具有以下优势: 高效率:查找效率高 高可用:可数据库共享 安全性强:数据不能随意修改 选择哪个数据库 数据库可以分为关系型数据库和非关 ...

  7. 全栈项目|小书架|服务器开发-Koa2 参数校验处理

    为什么需要做参数校验 在开发中,无论是App开发还是服务器接口开发, 我们无法去预测用户传入的数据,因此参数(数据)校验是开发中不可或缺的一环. 例如像App的注册登录表单提交页面,就要做好多层的判断 ...

  8. 全栈项目|小书架|服务器开发-Koa全局路由实现

    什么是路由 路由就是具体的访问路径,指向特定的功能模块.一个api接口是由ip(域名)+端口号+路径组成,例如 :https://www.npmjs.com/package/koa-router就是一 ...

  9. 全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口

    通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看 ...

随机推荐

  1. Linux启动与停止Tomcat

    停止Tomcat: cd 切换到Tomcat的bin目录下,关闭命令:[root@localhost bin]# ./shutdown.sh 检查tomcat是否已关闭,检查命令:[root@loca ...

  2. avalon用background-image不起作用,怎么来选取前几个的图片进行渲染

    <span ms-css="{backgroundImage: 'url('+item.image + ')'}" ms-for="($index,item) in ...

  3. CS224n学习笔记(三)

    语言模型 对于一个文本中出现的单词 \(w_i\) 的概率,他更多的依靠的是前 \(n\) 个单词,而不是这句话中前面所有的单词. \[ P\left(w_{1}, \ldots, w_{m}\rig ...

  4. 第06组 Beta冲刺(4/5)

    队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 继续维护后端代码 继续学习深入python 继续研究匿名拨打电话问题.套牌多结果处理问题 ...

  5. TCP的连接如何知道对方已经异常断开

    断电的话,对方不会发送任何数据包过来,包括RST.主机无法得知.如果是TCP已经连接,有个定时器,会发送空包,sequence number不变.如果一直收不到ack,会断定对方已经无法通信,而释放系 ...

  6. C# 最简单的使程序单进程运行的方法

    1.代码1 static void Main() { Process current = Process.GetCurrentProcess(); Process[] processes = Proc ...

  7. golang testing 无法获取覆盖率问题

    https://segmentfault.com/q/1010000021142202

  8. ARM USB 通信(转)

    ARM USB 通信 采用ZLG的动态链接库,动态装载. ARM是Context-M3-1343. 在C++ Builder 6 中开发的上位机通信软件. USB通信代码如下: //--------- ...

  9. Android dump命令查看某个apk是被谁安装的?

    adb shell dumpsys package packages > packageAll.txt     ORadb shell pm dump packages > package ...

  10. Python3基础 tuple 使用格式化字符串进行输出

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...