【问题标题】:Iron Route - Server Side, access this.params from onBeforeAction()Iron Route - 服务器端,从 onBeforeAction() 访问 this.params
【发布时间】:2018-02-09 22:34:42
【问题描述】:

我需要从我的流星应用程序中提供一些 REST API 端点。
端点必须在服务器端可访问,因此我使用 Iron 路由器进行服务器端路由。
一切正常,但现在我需要访问this.params 进行权限检查。

我目前的路线:

Router.route('myServerRoute', {
    where: "server",
    path: '/api/v1/doit/:partner',
    onBeforeAction: function(req, res, next) {
        API.beforeAction(req, res, next, ['admin','API']);
    }
})

API.beforeAction 是我用来验证用户令牌的函数(此令牌位于其中一个标头中)
此函数检查令牌是否有效以及该用户是否具有第 4 个参数中的角色之一

:partner 是使用 API 的合作伙伴的名称。

假设:partner'store1' (/api/v1/doit/store1)
我想验证只有具有store1 角色的用户 才能访问/api/v1/doit/store1 URL
所以我想将:partner参数的值传递给API.beforeAction函数

onBeforeAction 函数上,我无权访问 this.params(它是空的)
有些人建议使用Router.current()访问参数
但这是一个客户端调用,它在服务器端不可用。

我可以使用req.url,解析它并获取合作伙伴名称。但是当我知道 Iron Route 已经解析了这个 URL 时,我不喜欢自己进行解析

对如何获取onBeforeAction 中的 URL 参数有什么建议吗?

【问题讨论】:

  • 奇怪,[iron router guide section on hooks](iron-meteor.github.io/iron-router/#using-hooks说“路由函数中所有可用的属性也都在这里可用,例如this.params”
  • @MichelFloyd,是的,我也这么认为...我尝试打印它 [console.log("params:",JSON.stringify(this.params, null, 2));]但它只是打印出一个空数组。我怀疑“this.params”仅在客户端路由上可用。
  • 哦,是的,服务器端。你能把你的角色检查放在路由操作的前面吗?
  • @MichelFloyd,是的,我可以。有几件事我不喜欢它:一些端点有 .post、.get、.put 和 .delete 动作……这意味着我必须为每个端点类型复制对我的新“globalValidatePermission”函数的调用不仅每条路线一次。 - 另外,从安全角度来看,我更喜欢未经许可的用户甚至不会开始运行实际的 Endpoint 代码。我以前不想抓住它。尽快
  • 那我觉得你在解析req.url

标签: meteor iron-router


【解决方案1】:

您无需在 onBeforeAction 中进行权限检查。我用 Iron Router 实现了我的 API。 在下面的示例中,我使用 API 密钥处理获取请求并返回信息或错误代码。

Router.route('/api/thing/:apikey', { where: 'server' })
.get(function getThing () {
    if (typeof this.params.apikey === 'undefined' || this.params.apikey.length != 16 || !Userprofile.findOne({ apiKey: this.params.apikey })) {
        this.response.statusCode = 403;
        return this.response.end('Not authorized');
    }
    const things = Thing.find({ owner: Userprofile.findOne({ apiKey: this.params.apikey }).owner }).fetch();
    if (things.length > 0) {
        this.response.statusCode = 200;
        return this.response.end(JSON.stringify(things));
    } else {
        this.response.statusCode = 200;
        return this.response.end('No things found');
    }
});

【讨论】:

  • 对于我的一些 API 端点,我有 POST、GET、PUT 和 DELETE...要在 4 个不同的函数中进行 4 次权限检查,会导致错误。另一件事是我使用 onBeforeAction 进行日志记录和警报。这样所有 API 请求都会得到相同类型的日志记录,如果我需要切换日志供应商,只有一个地方可以更改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多