2013-11-02 3 views
4

node.js를 사용하여 API를 작성하고 표현합니다. 하지만 외부 서버에 대한 특정 경로에서 일부 요청을 프록시하고 요청을 수행하는 클린트에 대한 외부 서버의 응답을 표시 할 수 있어야합니다.노드, 기본 인증 헤더가있는 외부 API에 대한 API 프록시 요청

하지만 클라이언트가 요청과 함께 보내는 기본 인증을 전달해야합니다.

내가 좋아하는 요청 모듈을 사용하여 시도했다 :

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), 

}) 

을하지만 내가 "금지 (403)는"다시 외부 서버를 형성 얻을 수 있기 때문에 기본 인증 헤더를 보내지 않도록 (www.external.com)

보인다 수행 할 때 몇 가지 문제가 있습니다, 그래서

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 직접 반대하지만 동일한 요청을 할 경우 작동 :

는 요청 메신저 결정처럼 찾고 노드의 프록시

답변

0

시도가 명시 적으로

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

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

+1

하지만 난 단지 인증 코드가 같은 클라이언트 요청에서 헤더에 인코딩 얻을 : 인증 :뿐만 아니라 다음과 같이 요청 헤더를 설정하고 응답 헤더를 복사하려면 기본 bmR4ZHpzNWZweWFpdjdxfG1vcmV1c2를 ****** * = 그래서 사용자 이름/비밀번호를 추가 할 수 없습니다. 어떻게 든이 헤더를 전달해야합니다. . ({: NEWURL, 헤더 : { '인증': '기본 bmR4ZHpzNWZweWFpdjdxfG1vcmV1c2 ******* ='} URL});' – morto

+0

당신은 너무 ' 요청과 같은 헤더를 설정할 수 있습니다 죄송합니다 지금 당신을 따르지 않아요. 요청에서 헤더를 가져 와서 외부 서버로 나가는 요청에 전달해야 할 필요가 있다고 생각하십니까? – Bulkan

+0

파이프 (고해상도) – morto

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) 
}) 
+0

좋아, 내 이해에서 나는 (0120)을 대체해야한다. 파이프 (입술), : .get ({url : newurl, headers { 'Authorization': req.get ('Authorization')}}). pipe (res); 하지만 난 것보다 얻을 : request.get ({URL : NEWURL, 헤더 { '인증'req.get ('인증')} ^ 구문 에러 : ":"예기치 않은 토큰 { – morto

+0

를 내가 놓친 죄송합니다 "헤더 후 코드 업데이트 됨 – gimenete

+0

Aaa가이를 읽었어야합니다 .hhmm 403 금지됨으로 작동하지 않습니다. 보내지는 로그를 얻을 수 있습니까? console.log (res)를 반환하면 내가 실제로 이해하지 못하는 많은 것들 – morto

관련 문제