Koa、koa-router、koa-jwt 鉴权详解:分模块鉴权实践总结
首先看koa-router
koa-router use
熟悉Koa的同学都知道use是用来注册中间件的方法,相比较Koa中的全局中间件,koa-router的中间件则是路由级别的。
koa-router中间件注册方法主要完成两项功能:
将路由嵌套结构扁平化,其中涉及到路由路径的更新和param前置处理函数的插入;
路由级别中间件通过注册一个没有method的Layer实例进行管理。
具体参看:玩转Koa -- koa-router原理解析 https://zhuanlan.zhihu.com/p/54960421
https://github.com/koajs/router/blob/master/API.md#module_koa-router--Router+use
koa-router添加中间件:
router.use([path], middleware) ⇒ Router
// session middleware will run before authorizerouter
.use(session())
.use(authorize());
// use middleware only with given path
router.use('/users', userAuth());
// or with an array of paths
router.use(['/users', '/admin'], userAuth());
app.use(router.routes());
更多可以参看:koa2学习笔记:koa-router使用方法及多路由代码组织 www.shanhuxueyuan.com/news/detail/128.html
koa koa-router路由层级 路由模块化
主应用中加载子路由模块:
let api = require('./api');
let admin = require('./admin');
let login = require('./login');
const koaJwt = require('koa-jwt');
const Const = require('../const');
const cors = require('koa2-cors');
module.exports = (app) => {
app.use(login.routes());
//这是处理前端跨域的配置
//这是处理前端跨域的配置
app.use(cors(
{
/* origin: function (ctx) {
// if (ctx.url === '/login') {
// return "*"; // 允许来自所有域名请求
// }
return '*';
},*/
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
maxAge: 5,
credentials: true,
allowMethods: ['GET', 'POST', 'DELETE'],
allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
}
)).use(api.routes());
app.use(koaJwt({
secret: Const.TokenGlobal
}).unless({ // 配置白名单
method: 'get',
path: [
/\/api\/img/
]
})).use(admin.routes());
}
子模块示例:
const Router = require('koa-router')
const newsRouter = new Router({
prefix: '/user' //前缀
})
const apiController = require('../controller/api')
newsRouter.post('/login', apiController.login)
module.exports = newsRouter
不同模块,分配不同的前缀
具体参看:koa2 router koa-router路由配置 bbs.itying.com/topic/5bcc1afb0e32ae0ac45a76e8
koa-jwt 实现模块化鉴权
百度谷歌能搜到的基本都是如此:koa-jwt 实现自定义排除动态路由的鉴权 # https://jwchan.cn/_posts/backend/node/koa_jwt_unless.html#场景描述
主要是使用koa-jwt的 unless , koa-jwt 的 unless 方法调用了 koa-unless 这个包,于是去阅读了 koa-unless 之后,发现可配置以下参数:
- method 它可以是一个字符串或字符串数组。如果请求方法匹配,则中间件将不会运行。
- path 它可以是字符串,正则表达式或其中任何一个的数组。如果请求路径匹配,则中间件将不会运行。
- ext 它可以是一个字符串或字符串数组。如果请求路径以这些扩展名之一结尾,则中间件将不会运行。
- custom 它必须是一个返回 true/ 的函数 false。如果函数针对给定的请求返回 true,则中间件将不会运行。该功能将通过 this 访问 Koa 的上下文
- useOriginalUrl 应该为 true 或 false,默认为 true。如果为false,path 则匹配 this.url 而不是 this.originalUrl。
比如在custom 配置自定义函数进行判断。这个实现肯定很补科学,对于超多模块鉴权,这个custom岂不是超级复杂。比如:https://github.com/ppap6/PPAP.server/blob/master/app.js
koa-jwt 中间件简化验证
分模块鉴权:
module.exports = (app) => {
app.use(login.routes());
app.use(koaJwt({
secret: Const.TokenGlobal
}).unless({ // 配置白名单
method: 'get',
path: [
/\/api\/img/
]
})).use(admin.routes());
}
模块里面在分路径鉴权:
router
.get('/', ctx => {
ctx.type = 'html';
ctx.body = fs.createReadStream('./public/index.html');
})
.get('/sign', ctx => {
let payload = {name: 'morilence'};
const token = jwt.sign(payload, 'fgnb', {
notBefore: 30,
expiresIn: 90
});
ctx.type = 'json';
ctx.body = {
token
};
})
/* 只需把koaJwt中间件写在涉及具体业务逻辑处理的中间件之前就ok啦! */
.get('/api', koaJwt({secret: 'fgnb'}), ctx => { // 参数对象指定密钥
ctx.type = 'json';
ctx.body = {
msg: '你追我,如果你追到我,我就让你...'
};
})
更详细可以参看:【Koa】利用 JWT 实现 token验证 https://blog.csdn.net/Morilence/article/details/104301904
整个工程配置可以参看:https://github.com/zhoulujun008/koa-pass-server
转载本站文章《Koa、koa-router、koa-jwt 鉴权详解:分模块鉴权实践总结》,
请注明出处:https://www.zhoulujun.cn/html/webfront/server/koa/8818.html
Koa、koa-router、koa-jwt 鉴权详解:分模块鉴权实践总结的更多相关文章
- IdentityServer4实战 - JWT Token Issuer 详解
原文:IdentityServer4实战 - JWT Token Issuer 详解 一.前言 本文为系列补坑之作,拖了许久决定先把坑填完. 下文演示所用代码采用的 IdentityServer4 版 ...
- JWT基础概念详解
JWT基础概念详解 JWT介绍 之前我们文章讲过分布式session如何存储,其中就讲到过Token.JWT.首先,我们来回顾一下使用Token进行身份认证. 客户端发送登录请求到服务器 服务器在用户 ...
- [转载]python 详解re模块
原文地址:python 详解re模块作者:Rocky 正则表达式的元字符有. ^ $ * ? { [ ] | ( ) .表示任意字符 []用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字 ...
- 详解Python模块导入方法
python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...
- Meterpreter提权详解
0x01 Meterpreter自动提权 1.生成后门程序 我们在kali的命令行下直接执行以下命令获得一个针对windows的反弹型木马: msfvenom -p windows/meterpr ...
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
- 【spring】jar包详解与模块依赖关系
以spring3.X为例 jar包详解 1. spring-core.jar:包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心: 2. spri ...
- laravel 之jwt认证使用详解
转载 http://www.heibaiketang.com/blog/show/3.html https://packagist.org/packages/tymon/jwt-auth#1.0.0- ...
- react router @4 和 vue路由 详解(八)vue路由守卫
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 13.vue路由守卫 a.beforeEach 全局守卫 (每个路由调用前都会触发,根据 ...
- react router @4 和 vue路由 详解(七)react路由守卫
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...
随机推荐
- DO、DTO、BO、AO、VO、POJO定义和转换的正确姿势
一.引言DO.DTO.BO.AO.VO.POJO的概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下. 通过各层POJO的使用,有助于提高代码的可读性和可维护性. ------------ ...
- MVC开发
我们通过前面的章节可以看到:https://www.liaoxuefeng.com/wiki/1252599548343744/1266264917931808 Servlet适合编写Java代码,实 ...
- PC电脑端如何多开Skype,一步搞定!
由于工作原因,本人经常会用到Skype来联系客户,目前有两个账号需要同时登录. 但是,Skype默认只能登录一个账号,而且安装的时候也不能自定义安装地址,所以没办法同时登录两个. 有的朋友可能会想到直 ...
- "拍牌神器"是怎样炼成的(三)---注册全局热键
要想在上海拍牌的超低中标率中把握机会.占得先机,您不仅需要事先准备好最优的竞拍策略,还要制定若干套应急预案,应对不时之需.既定策略交给计算机自动执行,没有问题.可是谁来召唤应急预案呢?使用全局热键应该 ...
- (Good topic)回文数(3.13 leetcode每日打卡)
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121输出: true 示例 2: 输入: -121输出: false解释: 从左向右读, ...
- 深入理解RC4加密算法
RC4(Rivest Cipher 4)是一种广泛应用的加密算法,由Ronald L. Rivest于1987年发明.它是一种流密码(stream cipher)算法,适用于对网络通信中的数据进行加密 ...
- String.trim()含义
就是去除两端空格,目前只用到了这个.
- 最全的VLOOKUP应用教程
VLOOKUP是Excel中最常用的函数之一,它可以让我们在一个表格中查找指定值,并返回与该值匹配的另一个单元格中的内容. 在这篇文章中,我们将深入探讨VLOOKUP的使用方法,从而为您提供一份史上最 ...
- VS Code安装教程
一.下载 1.官网 下载地址:https://code.visualstudio.com/Download 2.下载 根据自己电脑型号下载,此处以Windows为例. 二.安装 1.下载完成后,直接点 ...
- Go语言函数详解
函数 (1)函数的定义 函数使用func进行定义 函数是基本的代码块,用于执行一个任务 Go语言至少有一个main函数 函数声明告诉了编译器函数的名称,返回类型和参数 //1.无参数无返回值函数的定义 ...