2017-08-31 83 views
0

我需要为我的流星应用程序提供一些REST API端点。
端点必须在服务器端可访问,所以我使用Iron路由器进行服务器端路由。
所有的作品都很棒,但现在我需要访问this.params进行许可检查。Iron Route - 服务器端,从onBeforeAction()访​​问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参数?

+0

怪异时,[铁路由器指南上的钩子部分(http://iron-meteor.github.io/iron-router/#using-hooks说“在路由功能中可用的所有特性也可在这里如this.params“ –

+0

@MichelFloyd,是的,我也这么认为... 我试图打印它[console.log(”params:“,JSON.stringify(this.params,null,2)); ]但它只是打印出一个空数组。 我怀疑“this.params”只有在客户端的路由是否可用。 – Izack

+0

噢亚,服务器端。你能不能把你的角色在路由操作,而不是前检查? –

回答

1

您不需要在onBeforeAction中进行权限检查。我用Iron Router实现了我的API。 在这个例子中波纹管我处理与API密钥的GET请求,并返回信息或错误代码。

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'); 
    } 
}); 
+0

对于我的一些API端点,我有POST,GET,PUT和DELETE ... 要在4种不同的权限中检查4次功能,会招致错误。 另一件事是我正在使用onBeforeAction进行记录和提醒。通过这种方式,所有的API请求都可以获得相同类型的日志记录,并且如果需要切换日志提供程序,那么只有一个地方需要更改 – Izack