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中的中间件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Meteor 模板助手编辑 Iron-Router 中作为参数传递的值?
Meteor js,iron-router,在服务器端使用 Route.go('...') 进行单元测试不起作用
Meteor Atmosphere/Core Package Dependency Resolution Override (jquery, iron-router, blaze)