使用loopback,我使用REST连接器创建了与现有API的连接,该连接器运行良好。但是,我想通过来自客户端的oAuth令牌。
我可以通过从ctx.req.headers.authorization
方法中抓取Model.beforeRemote
来获取oAuth令牌,但似乎无法找到将其作为新标头传递给REST连接器的方法。< / p>
我尝试过几件事:
Model.observe
添加一个钩子(但这似乎与REST连接器无关)。任何想法都赞赏。
答案 0 :(得分:0)
想要回答这个问题,并以布莱恩的评论为基础。首先,在datasources.json中,您将要设置REST连接器:
{
"name": "connect",
"connector": "rest",
"debug": "true",
"operations": [
{
"template": {
"method": "GET",
"url": "http://server/api",
"headers":{
"authorization": "Bearer {token}"
}
},
"functions": {
"get": ["token"]
}
}
]
}
正如Bryan所述,可以在每次调用或连接器的根目录中放置auth标头。
其次,这就是我被困住的位,为了将令牌传递给模型的API调用,需要生成一个将令牌作为查询参数传递的远程方法。这就是这个例子中的样子:
module.exports = function (Model) {
Model.disableRemoteMethod('invoke', true);
Model.disableRemoteMethod('get', true);
Model.call = function (req, cb) {
var token = req.token;
Model.get(token, function (err, result) {
cb(null, result);
});
};
Model.remoteMethod(
'call',
{
http: {path: '/', verb: 'get'},
accepts: [
{arg: 'req', type: 'object', http: {source: 'req'}}
],
returns: {
root: true
}
}
);
};
注意为了向模型提供请求,如何需要req参数。您还注意到我已禁用原始的get和invoke方法(将其替换为更友好的REST资源)。
最后,您需要将令牌放入请求中。为此,使用一些中间件很容易。这是来自server.js的一个例子:
app.use('/api', function (req, res, next) {
oidc.authenticate(req, function (err, token) {
if (err) {
return res.send({status: 401, message: err});
}
req.token = token;
next();
});
});
在上面的示例中,我使用内部OIDC提供程序来验证令牌,但当然,您可以使用任何内容。