首先看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 鉴权详解:分模块鉴权实践总结的更多相关文章

  1. IdentityServer4实战 - JWT Token Issuer 详解

    原文:IdentityServer4实战 - JWT Token Issuer 详解 一.前言 本文为系列补坑之作,拖了许久决定先把坑填完. 下文演示所用代码采用的 IdentityServer4 版 ...

  2. JWT基础概念详解

    JWT基础概念详解 JWT介绍 之前我们文章讲过分布式session如何存储,其中就讲到过Token.JWT.首先,我们来回顾一下使用Token进行身份认证. 客户端发送登录请求到服务器 服务器在用户 ...

  3. [转载]python 详解re模块

    原文地址:python 详解re模块作者:Rocky 正则表达式的元字符有. ^ $ * ? { [ ] | ( ) .表示任意字符 []用来匹配一个指定的字符类别,所谓的字符类别就是你想匹配的一个字 ...

  4. 详解Python模块导入方法

    python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...

  5. Meterpreter提权详解

      0x01 Meterpreter自动提权 1.生成后门程序 我们在kali的命令行下直接执行以下命令获得一个针对windows的反弹型木马: msfvenom -p windows/meterpr ...

  6. 手游录屏直播技术详解 | 直播 SDK 性能优化实践

    在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...

  7. 【spring】jar包详解与模块依赖关系

    以spring3.X为例 jar包详解 1. spring-core.jar:包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心: 2. spri ...

  8. laravel 之jwt认证使用详解

    转载 http://www.heibaiketang.com/blog/show/3.html https://packagist.org/packages/tymon/jwt-auth#1.0.0- ...

  9. react router @4 和 vue路由 详解(八)vue路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 13.vue路由守卫 a.beforeEach 全局守卫 (每个路由调用前都会触发,根据 ...

  10. react router @4 和 vue路由 详解(七)react路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...

随机推荐

  1. P8816 [CSP-J 2022] 上升点列

    Problem 考察算法:\(DP\). 题目简述 给你 \(n\) 个点,每个点有一个坐标 \((x_i,y_i)\),还可以添加 \(k\) 个点. 添加之后,求:最长的上升点列的长度. 上升点列 ...

  2. JSON文件解析工具类(java)

    JSON文本转JSONObject对象 当我们给前端返回样式的时候,需要处理json格式的前端样式,往往只需要改变局部数据.但是每次操作都要构造一个JSON对象,如果层级比较多的话,写法较为复杂,也不 ...

  3. [WPF]浅析资源引用(pack URI)

    WPF中我们引用资源时常常提到一个概念:pack URI,这是WPF标识和引用资源最常见的方式,但不是唯一的方式.本文将介绍WPF中引用资源的几种方式,并回顾一下pack URI标识引用在不同位置的资 ...

  4. L2-031 深入虎穴

    并没有说根是谁 #include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; const ...

  5. Vue公共loading升级版(处理并发异步差时响应)

    公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤: 1.通过全局状态管理定义状态值(vuex.pinia等). 2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画. ...

  6. pygame播放视频并实现音视频同步

    一.前言 在我接触pygame时最新的pygame已经不支持movie模块,这就导致在pygame播放视频变成一个问题,网上搜了下解决方案有两个: 一是使用opencv播放视频,再结合pygame.m ...

  7. Spring Cloud 整合

    前言 玩SpringCloud之前最好懂SpringBoot,别搞撑死骆驼的事.Servlet整一下变成Spring:SSM封装.加入东西就变为SpringBoot:SpringBoot再封装.加入东 ...

  8. Modbus 转 PROFIBUS DP 应用场景 PM-160

    1)在网关PROFIBUS DP侧是一个PROFIBUSDP从站,在Modbus串口侧有Modbus主站.Modbus从站.通用模式可选:接口有RS232RS485.RS422三种可选. 2)通信方式 ...

  9. MCU看门狗使用注意事项

    前言 最近因为项目产品硬件设计有问题,导致设计的一款产品把硬件电源开关以及硬件系统复位功能去掉了.更严重的是,这产品已经开始生产了,硬件已经无法修改,所以软件必须上看门狗,否则设备死机或是异常后就只能 ...

  10. 如何生成core文件进行项目调试

    由于项目前期的调试错误比较多,或者有某些隐藏危险:例如内存泄漏:偶尔才出现一次,如果没有捕捉错误的手段可能好不容易出现的机会就溜走了,所以生成core文件是必要的,发生段错误会生成相应的core文件, ...