通过这篇 全栈项目|小书架|服务器开发-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. C Primer Plus--C预处理器和C库(2)

    目录 #include指令 头文件 其他指令 #undef 条件编译 内联函数 #include指令 #include <头文件.h>//在标准系统目录中寻找头文件 #include &q ...

  2. Java为什么没有指针

    为了摒弃指针带来的风险(当然了,也就放弃了指针带来的效率). 1.C/C++为什么有指针? 这个很简单,程序都是在内存中运行的,只要有内存,就有内存地址,有地址,就必然有指针,只是C++对内存地址的访 ...

  3. element ui里面table分页,页数从0开始的怎么做?

    需求: 后台请求的接口是从0页开始的,但是pagination是从1开始的,就是在点击pagination的第1页是后台转0 1首先在data里面定义为1,其他地方也是定义1 return { for ...

  4. spring 整合 servlet

    目的:记录spring整合 servlet过程demo.(企业实际开发中可能很少用到),融会贯通. 前言:在学习spring 过程(核心 ioc,aop,插一句 学了spring 才对这个有深刻概念, ...

  5. git 全量同步分支

    当前分支是maser分支,我想将stable分支上的代码完全覆盖brush分支,首先切换到brush分支. git reset --hard origin/stable 执行上面的命令后brush分支 ...

  6. Linux安装问题解决

    首先安装VM,之后下载centos7.5 安装好vm后运行时无法执行操作 提示 已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作. 此主机支持 Intel VT-x,但 I ...

  7. Cesium学习笔记(六):几何和外观(Geometry and Appearances)【转】

    https://blog.csdn.net/UmGsoil/article/details/74912638 我们先直接来看一个例子 var viewer = new Cesium.Viewer('c ...

  8. Multi-shot Pedestrian Re-identification via Sequential Decision Making

    Multi-shot Pedestrian Re-identification via Sequential Decision Making 2019-07-31 20:33:37 Paper: ht ...

  9. Python17个常用内置模块总结

    Python17个常用内置模块总结 1.getpass 2.os 3.sys 4.subprocess 5.hashlib 6.json 7.pickle 8.shutil 9.time 10.dat ...

  10. unable to lock the administration错误解决

    在ubantu系统上,使用 apt-get 命令或者其相对更新的APT 管理工具时,遇到 unable to lock the administration directory (/var/lib/d ...