我需要从我的流星应用程序中提供一些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
网址
所以我想将:partner
参数的值传递给API.beforeAction
函数
在onBeforeAction
功能上,我无法访问 this.params
(它是空的)
有人建议使用Router.current()
来访问参数
但这是客户端调用,并且它不可用于服务器端。
我可以使用req.url
,解析它并获取合作伙伴名称。但是当我知道Iron Route已经解析了这个URL
有关如何在onBeforeAction
内获取网址参数的任何建议吗?
答案 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');
}
});