Я устанавливаю 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).
Логика, которую я использую, заключается в следующем:
подключиться к остальному серверу в beforeRemote для аутентификации.
отправить запрос первымвремя для получения дайджест-информации (nonce number и т. д.) из response.header['www-authenticate']
.
отправьте запрос авторизации во второй раз с дайджест-информацией, чтобы подтвердить свою подлинность.
У меня даже нет плана, но после проверки подлинности я могу отправить запрос на получение данных 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);
});
};
Я даже не уверен, что это правильный способ сделать это.Пожалуйста, помогите!
Любая помощь будет принята с благодарностью!