在Loopback 3 Rest连接器中构造摘要授权客户端,以从Rest服务器获取数据(更新5/21)

时间:2019-05-20 15:42:49

标签: node.js rest api loopback digest-authentication

我正在Loopback 3中设置一个API,以使用loopback-connector-rest(v3.4.1)来调用另一个REST API以获取JSON数据。目标REST服务器需要摘要授权。如何在此rest调用中传递摘要auth标头以获取数据?

我已经初始化loopback 3项目,并在依赖项中添加了loopback-connector-rest。我已经在datasources.json中设置了休息连接器,为此调用建立了模型,尝试在datasources.json或该模型中附加Digest标头,但是失败了。

我碰巧使用Postman来验证REST服务器中的数据,只是将摘要身份验证代码从其中复制到loopback文件中。无论我将Digest标头放在什么位置,我都看不到摘要结果(tokencnonce等)从REST服务器返回。我还尝试从Model.beforRemote发送摘要信息,但是我得到的结果是401:Your session has failed authentication...,我想知道我是否必须在server.js或中间件文件中进行操作才能预先发送摘要信息。

更新5/21: 我尝试使用Node.js request程序包将其余服务器与Digest auth连接,但始终获得401未经授权。我不确定我是否在正确的地方编写了请求代码,但是我将其编码在为其余连接创建的模型中(test-one-model.js)。

我使用的逻辑是:

  1. 在beforeRemote中连接到休息服务器以进行身份​​验证。

  2. 第一次发送请求以从response.header['www-authenticate']获取摘要信息(现时编号等)。

  3. 第二次发送带有摘要信息的身份验证请求,以使自己获得身份验证。

  4. 我什至没有计划,但是一旦通过身份验证,我就可以发送请求以从服务器获取REST数据。

datasources.json:(updated 5/21)
{
  "db": {
    "name": "db",
    "connector": "memory"
  },
  "TestOne": {
    "name": "TestOne",
    "baseURL": "https://url.com/",
    "crud": false,
    "connector": "rest",
    "options": {
      "headers": {
        "accept": "application/json",
        "content-type": "application/json",
      },  
      "strictSSL": false
    },
    "operations": [{
      "template": {
        "method": "GET",
        "url": "https://url.com/endpoint",
        "headers": {
"connection":"keep-alive",
          "Content-Type": "application/json;charset=UTF-8",
          "Authorization": "Digest username=\"username@company\",qop=\"auth\", realm=\"TestOne\", nonce=\"undefined\", uri=\"/TestOne/rest/endpoint\", algorithm=\"MD5\", response=\"\"",
          "cache-control": "no-cache"
        },
        "form":false,
        "responsePath": "$.results.*"
      },
      "functions":{
          "login":[]
      }
    }]
  }
}
test-one-model.js:(updated 5/21)
module.exports = function(Testonemodel) {
//set up request from request package
const request = require('request');
    Testonemodel.beforeRemote('login',function(ctx,next){
//init variable
    var nonce = "";
//set up first call option
    var InitOptions = { method: 'GET',
      url: 'https://url.com/TestOne/rest/auth',
      headers: 
      { 'connection':'keep-alive',
        Authorization: 'Digest username="username@company", realm="TestOne", nonce="undefined", uri="/TestOne/rest/auth", algorithm="MD5", response="123456789abcdefghijklmnopqrstuvw"',
        'Content-Type': 'application/json;charset=UTF-8' },
      form: false };
// first request to rest server
      request(InitOptions, function (error, response, body) {
        if (error) throw new Error(error);
        console.log(response.statusCode);//get 401
        console.log(response);
        console.log(body);// unauthorized
        var authInHeader = response.headers['www-authenticate'];
// get nonce from response header
        nonce = authInHeader.substr(authInHeader.indexOf('nonce="')+7).replace(/["]+/g,'');
        console.log(nonce);
      });

// set up second call option    
      var CounterOptions = { method: 'GET',
      url: 'https://url.com/TestOne/rest/endpoint/1234567',
      headers: 
      { 
        // 'cache-control': 'no-cache',
        'connection':'keep-alive',
        Authorization: 'Digest username="username@company", qop="auth", realm="TestOne", nonce="'+ nonce +'", uri="/TestOne/rest/endpoint/1234567", algorithm="MD5", response="123456789abcdefghijklmnopqrstuvw"',
        'Content-Type': 'application/json;charset=UTF-8' },
      form: false };
// call second time to rest server      
      request(CounterOptions, function (error, response, body) {
        if (error) throw new Error(error);
        console.log(response.statusCode);//still 401
        console.log(response);
        console.log(body);
      });
};

我什至不确定这是正确的方法。请帮忙!

任何帮助将不胜感激!

0 个答案:

没有答案