节点,用基本的auth头表示对外部API的API代理请求

时间:2013-11-02 15:59:06

标签: node.js api express proxy

我使用node.js和express构建了一个API。 但我需要能够将特定路由上的一些请求代理到外部服务器,并显示外部服务器对执行请求的clint的响应。

但我还需要转发客户端随请求发送的基本身份验证。

我尝试过使用请求模块,如:

app.get('/c/users/', function(req,res) {
  //modify the url in any way you want
  var newurl = 'https://www.external.com' 
  request(newurl).pipe(res),

})

但它似乎没有发送基本的auth标头,因为我从外部服务器(www.external.com)获得“403 Forbidden”

我正在制作的请求看起来像:

GET http://example.se:4000/c/users/ HTTP/1.1
Accept-Encoding: gzip,deflate
X-version: 1
Authorization: Basic bmR4ZHpzNWZweWFpdjdxfG1vcmV1c2*******=
Accept: application/json
Host: example.se:4000
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

如果我直接针对www.external.com执行完全相同的请求,那么它会起作用,因此在节点中执行代理时会出现问题。

2 个答案:

答案 0 :(得分:2)

request模块完全没有意识到你没有明确传递给它的任何东西。要设置请求标头并复制响应标头,请执行以下操作:

// copy headers, except host header
var headers = {}
for (var key in req.headers) {
  if (req.headers.hasOwnProperty(key)) {
    headers[key] = req.get(key)
  }
}
headers['host'] = 'final-host'

var newurl = 'http://final-host/...'
request.get({url:newurl, headers: headers }, function (error, response, body) {
  // debug response headers
  console.log(response.headers)
  // debug response body
  console.log(body)

  // copy response headers
  for (var key in response.headers) {
    if (response.headers.hasOwnProperty(key)) {
      res.setHeader(key, response.headers[key])
    }
  }
  res.send(response.statusCode, body)
})

答案 1 :(得分:0)

尝试明确传递auth详细信息,如此

request(newurl).auth(username, password).pipe(res);

https://github.com/mikeal/request#http-authentication