2015-02-10 34 views
0

对于Web应用程序,我试图从需要基本身份验证的RESTful服务中提取一些数据。NodeJS`request`返回“需要身份验证”。在HTTPS上GET

到目前为止,我有以下代码:

var req = request({ 
    auth: 'Basic aGVsbG8gd29ybGQ=', //base64 encoded credentials "hello world" 
    url: url.resolve("https://rest.someurl.com", "/url/to/data.xml"), 
    method: "GET", 
    jar: true 
}, function(err, res, body) { 

    if(err) return util.err(err); 

    console.log(body); 

}); 

当我渡过难关邮差服务这个URL设置认证头得当返回数据。另外,当我删除auth选项并直接在URL中输入用户名/密码时,我也会正常返回数据。我没有得到任何数据的唯一情况是上面的代码。

我上面的代码出现了什么问题,或者我应该添加什么来使其工作?

回答

1

尝试让请求通过在URL中提供明文用户名和密码来处理基本授权标头。请求会为您格式化。你也很可能不需要jar选项,默认方法是GET因此不需要指定。

var username = "your-username"; 
var password = "your-password"; 
var req = request({ 
    url: "https://" username + ":" + password + "@rest.someurl.com/url/to/data.xml") 
}, function(err, res, body) { 

    if(err) return util.err(err); 

    console.log(body); 

}); 
+0

我宁愿不直接在URL中输入用户名和密码,因为它应该通过标头传递。 – 2015-02-11 08:55:53

+0

它不会在URL中传递。阅读基本身份验证的工作原理。 'request'将取得凭证,base64将它们按照HTTP规范进行编码,并在向服务器发送请求时将它们传递到“Authorization”标题中。从安全角度来看,它与您的原始代码完全相同(除了它将实际工作)。 – 2015-02-11 15:01:38

0

分享我的代码稍大的范围,我发现我需要的request()呼叫转移到回调我必须得到用户名和密码正确传播的内部。

var getData = exports.getData = function() { 

    var credentials = ""; 
    getCredentials(function(creds) { 
    credentials = { 
     'user': creds.username, 
     'pass': creds.password 
    } 
    var req = request({ 
     auth: credentials, 
     url: url.resolve("https://rest.someurl.com", "/url/to/data.xml") 
    }, function(err, res, body) { 

     if(err) return util.err(err); 

     console.log(body); 

    }); 
    }); 
}