Iron-router中的中间件

Posted

技术标签:

【中文标题】Iron-router中的中间件【英文标题】:Middleware in Iron-router 【发布时间】:2019-05-16 08:28:40 【问题描述】:

我正在尝试使用 Iron-router 在 Meteor 服务器端 API 中应用 JWT(JSON Web 令牌)。 我能够创建令牌,但我无法在 Iron-router 中获取方法来编写用于验证该令牌的中间件。 能否请您解释一下使用哪种方法编写中间件以及如何定义它?

【问题讨论】:

请添加一些代码和您正在使用的路由器文档部分。 【参考方案1】:

在 Iron-router 中,中间件是使用 onBeforeAction 方法定义的(参见 the guide 中的“服务器挂钩和连接”)。所以对于 JWT 验证,你可以使用这样的东西:

import  Meteor  from 'meteor/meteor';
import  Router  from 'meteor/iron:router';
import jwt from 'jsonwebtoken';

Router.onBeforeAction(function(req, res, next) 
    jwt.verify(req.query.token, "secret", (err, decoded) => 
      if (err) 
        console.log(`Failed to verify token. Error: "$err"`);
        res.statusCode = 401;
        res.end('invalid token');
       else 
        next();
      
    );
  , where: 'server');

// example server-side route for testing
Router.route('/server',  where: 'server' )
  .get(function () 
    this.response.end('ok');
  )

失败的例子(真否定):

> curl -i localhost:3000/server?token=totally-wrong
HTTP/1.1 401 Unauthorized
date: Mon, 25 Nov 2019 16:41:33 GMT
connection: keep-alive
transfer-encoding: chunked

invalid token

成功例子(真阳性):

> curl -i localhost:3000/server?token=eyJhbGciOiJIUzI1NiJ9.MTIzNDU2Nzg5MA.oy8UH-Y_-5ztrLKo8zgx-8b8AKvUTy4ijH-ItJU32qo
HTTP/1.1 200 OK
date: Mon, 25 Nov 2019 16:41:52 GMT
connection: keep-alive
transfer-encoding: chunked

ok

【讨论】:

【参考方案2】:

有几种方法可以实现这一点,我认为最简单的方法是将您的逻辑应用到路由的操作方法中,如下所示:

Router.route("/dashboard", 
  name: "dashboard",
  action: function() 
    const token = this.params.query.token
    try 
      var decoded = jwt.verify(token, "secret");
      this.render()
     catch (err) 
      this.render("home"); // go home
    
  
);

您也可以尝试修改docs 中提到的钩子或插件。

【讨论】:

以上是关于Iron-router中的中间件的主要内容,如果未能解决你的问题,请参考以下文章

在 Iron-Router 中为相同 URL 推送新状态

如何使用 Meteor 模板助手编辑 Iron-Router 中作为参数传递的值?

Meteor js,iron-router,在服务器端使用 Route.go('...') 进行单元测试不起作用

Meteor Atmosphere/Core Package Dependency Resolution Override (jquery, iron-router, blaze)

Express JS 中的中间件是啥

Django2.X中的中间件