loopback.io rest connector - 如何传递oAuth令牌

时间:2015-04-27 15:19:44

标签: oauth loopbackjs strongloop

使用loopback,我使用REST连接器创建了与现有API的连接,该连接器运行良好。但是,我想通过来自客户端的oAuth令牌。

我可以通过从ctx.req.headers.authorization方法中抓取Model.beforeRemote来获取oAuth令牌,但似乎无法找到将其作为新标头传递给REST连接器的方法。< / p>

我尝试过几件事:

  1. 使用Model.observe添加一个钩子(但这似乎与REST连接器无关)。
  2. 使用带有授权字段的模板 - 但无法使其正常工作。
  3. 任何想法都赞赏。

1 个答案:

答案 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提供程序来验证令牌,但当然,您可以使用任何内容。