2014-10-24 1 views
0

저는 nodejs에서 golang (그러므로 두 개의 태그)으로 작은 응용 프로그램을 변환하려고하고 있습니다. 그러나 이렇게하는 데 약간의 문제가 있습니다.POST를 통한 로그인이 유효한 세션을 생성하지 않습니다.

본질적으로 그것은 매우 단순한 http POST 로그인으로 실현 될 수 없습니다. 배경은 대학에서 캘린더 내보내기 기능을 제공하며이 캘린더를 Google Cal에 추가 할 수있는 피드로 제공하고자합니다.

이제 모든 것은 노드에서 작동하지만 실제로는 실현할 수 있기를 바랍니다.

노드 코드의 중요한 비트는 내가 이동에서 동일한 작업을 수행하려고하면

import "github.com/parnurzeal/gorequest" 
//... 
resp, body, err := gorequest.New().Post(LOGIN_URL).Send("u=user&p=pass").End() 
//extract cookies etc. 

매력처럼 작동되지만

var query = url.parse(req.url, true).query; 
var data = { 
    u: query.user, // Username 
    p: query.password, // Password 
}; 
needle.post(LOGIN_URL, data, {}, function (error, response) { 
    //extract cookies etc. 
}); 

내가 끝낼 것 잘못된는 (시간 초과) 세션. 나는 이미 net/http를 사용해 보았는데, 아무것도 변경하지 않는 것 같다.

POST 요청 결과는 개요 페이지로의 302 리디렉션입니다 (Btw : ASP 기반). gorequest가 resp에서 반환 된 쿠키없이 해당 개요 페이지를 가져 와서 승인되지 않은 새 세션을 효과적으로 생성했기 때문에 또는 문제가 발생했을 수 있습니까? 아니면 끔찍하게 간단한 것을 간과하고 있습니까?

+3

여기에'gorequest'를 사용하면 어떤 이점도 보이지 않습니다. 다른 점은 뭔가 숨기고 있다는 것입니다. 'net/http'를 사용하여 정확히 무슨 일이 일어나는지보십시오. – JimB

+1

JimB가 말한 것처럼 : net/htt를 사용하십시오. 그리고 전체 코드와 전송 된 데이터를 보여주십시오. – Volker

답변

0

그래서 나는 당신의 충고에 따라 "net/http"를 사용하고 http.Client가 실제로하는 일을 조금 더 자세히 파헤 쳤다. 비슷한 문제가 발생할 수있는 사람은 다음과 같습니다.

see documentation에 의해 30x 응답을 받으면 http.Client가 자동으로 리디렉션합니다. 리디렉션 정책을 무시할 수는 있지만 리디렉션을 완전히 막지 못했습니다.

또한 리디렉션시 모든 헤더를 삭제하므로 클라이언트에 버그가있는 것처럼 보입니다 (see the issue 또는 in the source 새 헤더가 생성되는 곳).

net/http에서 검색하는 동안 http.Client에서 사용하는 http.DefaultTransport가 발견되었고 리디렉션되지 않습니다. 다소 낮은 수준이고 정확히 내가 한 것 같습니다.

data := url.Values{"u": {USER}, "p": {PASS}} 
req, err := http.NewRequest("POST", LOGIN_URL, bytes.NewBufferString(data.Encode())) 

//I needed quite some time to figure out that I needed to set the content type accordingly 
req.Header.Add("Content-Type", "application/x-www-form-urlencoded") 
//... 
resp, err := http.DefaultTransport.RoundTrip(req) 
//... 
//resp.Header["Set-Cookie"] now contains the login/session cookies 

I 쿠키 나 자신을 추출하고 몇 가지 헤더 값을 설정해야하지만이 솔루션은 완벽하게 작동하고 나는 그것으로 매우 기쁘게 생각합니다 : 다음 코드 조각은 내가 위에서 gorequest 실현 라인을 교체하는 방법을 보여줍니다. 누구나 내 솔루션이나 다른 조언을 듣는다면 기쁜 일입니다. JimB와 Volker 덕분에 :).

관련 문제