Создайте клиент авторизации дайджеста в коннекторе Loopback 3 для получения данных с остального сервера (обновление 5/21) - PullRequest
0 голосов
/ 20 мая 2019

Я устанавливаю API в Loopback 3 для вызова другого REST API, используя loopback-connector-rest(v3.4.1) для получения данных JSON.Целевой REST-сервер требует дайджест-авторизации.Как я могу передать дайджест-аутентификационный заголовок в этом вызове rest для получения данных?

Я инициализировал loopback 3 проект и добавил loopback-connector-rest в зависимости.Я установил соединитель отдыха в datasources.json, создал модель для этого вызова, попытался подключить заголовок дайджеста в datasources.json или этой модели, но не получилось.

Я использовал Postman для проверки данныхна сервере REST и просто скопировал из него дайджест-код авторизации в loopback файлы.Независимо от того, куда я поместил заголовок дайджеста, я не мог видеть результат дайджеста (token, cnonce, т. Д.), Возвращающийся с сервера REST.Я также пытался отправить дайджест-информацию с Model.beforRemote, но в результате получил 401:Your session has failed authentication... Интересно, мне нужно сделать это в server.js или файлах промежуточного программного обеспечения, чтобы заранее отправить дайджест-информацию.

Обновление5/21: Я пытаюсь использовать пакет Node.js request для подключения остального сервера с Digest auth, но продолжаю получать 401 Unauthorized.Я не уверен, что пишу код запроса в нужном месте, но я использую его в модели, которую я создал для соединения с остальными (test-one-model.js).

Логика, которую я использую, заключается в следующем:

  1. подключиться к остальному серверу в beforeRemote для аутентификации.

  2. отправить запрос первымвремя для получения дайджест-информации (nonce number и т. д.) из 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);
      });
};

Я даже не уверен, что это правильный способ сделать это.Пожалуйста, помогите!

Любая помощь будет принята с благодарностью!

...