铁路由器中的中间件

时间:2018-12-15 07:13:23

标签: meteor middleware iron-router

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

2 个答案:

答案 0 :(得分:2)

在铁路由器中,中间件是使用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

答案 1 :(得分:0)

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

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中提到的挂钩或插件。