通过这篇 全栈项目|小书架|服务器开发-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. 白天不懂夜的黑追寻Android规范

    有趣有内涵的文章第一时间送达! 喝酒I创作I分享 关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 生活中总有些东 ...

  2. mysql round()函数以及convert()函数,保留n位小数

    mysql> ); +----------------+ | round() | +----------------+ | 2.23 | +----------------+ row in se ...

  3. 高斯混合模型(GMM)及MATLAB代码

    之前在学习中遇到高斯混合模型,卡了很长一段时间,在这里记下学习中的一些问题以及解决的方法.希望看到这篇文章的同学们对高斯混合模型能有一些基本的概念.全文不废话,直接上重点. 本文将从以下三个问题详解高 ...

  4. ICEM-简单拉伸

    原视频下载地址:https://pan.baidu.com/s/1bpjAOv9 ;密码: rnkd

  5. 多维矩阵转一维数组(c++)【转载】

    在由二维矩阵转为一维数组时,我们有两种方式:以列为主和以行为主. 以列为主的二维矩阵转为一维数组时,转换公式为: index=column+row×行数 以行为主的二维矩阵转为一维数组时,转换公式为: ...

  6. 【2019.12.04】SDN上机第6次作业

    实验拓扑 通过图形化界面建立拓扑 先清除网络拓扑 sudo mn -c 生成Python语句 #!/usr/bin/python from mininet.net import Mininet fro ...

  7. rust控制流

    fn main() { let number = 6; if number % 4 == 0 { println!("number is divisible by 4"); } e ...

  8. 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web1]Dropbox 一.涉及知识点 1.任意文件下载 2.PHAR反序列化RCE 二.解题方法 刷题记录:[CISCN2019 华北赛区 ...

  9. MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法

    MySQL8.0报错Can't connect to MySQL server on 'localhost' (10061)的解决办法 事情的起因     今天课堂上要展示小组项目,需要用一个软件叫W ...

  10. jmeter BeanShell断言(四)

    Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log ...