通过这篇 全栈项目|小书架|服务器开发-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中携带的数据了。

在获取热搜书籍接口中取出先前传递的uid和scope:

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. Pyton项目打包成exe文件

    Python项目打包成exe文件 1 系统环境 windows版本: Win7 64位 python环境:Anaconda python版本:3.6 64位 pyinstaller版本:3.5 1 安 ...

  2. AT1879 2 つの山札

    题面 题解 直接求解比较麻烦,考虑将问题进行转化. 设序列\(a = \{3, 1, 4, 2, 5\}, b = \{3, 2, 4, 1, 5\}\),那么我们构造一个正方形方格,将\(a\)放在 ...

  3. SDN第五次上机实验

    1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解. 1.通过源码安装RYU控制器 sudo apt-get install python3-pip git clo ...

  4. @PathVariable不起作用,报错:Cannot resolve @PathVariable ' '

    @PathVariable是占位符注解.可以把Url中变量的值传递到方法参数中. 示例如下: @PostMapping("/user/name/{id}") @ResponseBo ...

  5. js - 总结一下条件语句优化

    [笔记] // 简单的语句用三目运算符也可以的(除了需要return的) 1 == 1 ? console.log('执行了...1') : console.log(); 1 == 2 ? conso ...

  6. deepnude | 福利

    程序好下载github有,但是没有lib,就是没有训练好的model. 以下是搜到的win平台程序的下载链接: magnet:?xt=urn:btih:7BE4EB8D640742D2FFEBD649 ...

  7. Tomcat 配置虚拟目录以及虚拟主机

    目录 虚拟目录 虚拟主机 虚拟目录 虚拟目录的功能 一般情况下,我们的打包后的项目都是放到tomcat/webapps目录下的,然后通过localhost:8080/project_name这个链接进 ...

  8. python脚本容器化

    https://blog.csdn.net/zstack_org/article/details/53099919 如何选择 base image: https://blog.csdn.net/nkl ...

  9. Centos7.3使用脚本自动静默安装oracle11.2.0.4数据库

    一直想着写一个脚本实现自动化安装oracle数据库.以下内容实验过几次了,可能还存在些小问题,如果在跑以下脚本中遇到问题,自己仔细排查即可 挣扎了好久,总算还是没实现,目前只能通过依次执行多个脚本来安 ...

  10. [LeetCode] 21. Merge Two Sorted Lists 合并有序链表

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...