我正在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标头放在什么位置,我都看不到摘要结果(token
,cnonce
等)从REST服务器返回。我还尝试从Model.beforRemote
发送摘要信息,但是我得到的结果是401:Your session has failed authentication...
,我想知道我是否必须在server.js
或中间件文件中进行操作才能预先发送摘要信息。
更新5/21:
我尝试使用Node.js request
程序包将其余服务器与Digest auth连接,但始终获得401未经授权。我不确定我是否在正确的地方编写了请求代码,但是我将其编码在为其余连接创建的模型中(test-one-model.js)。
我使用的逻辑是:
在beforeRemote中连接到休息服务器以进行身份验证。
第一次发送请求以从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);
});
};
我什至不确定这是正确的方法。请帮忙!
任何帮助将不胜感激!