2013-12-10 5 views
3

파이썬에서 HTTPS 요청을해야하고 요청 모듈을 사용하여 더 쉽게 사용할 수 있도록 노력하고 있습니다.요청 모듈을 사용하여 파이썬 HTTPS 요청을하는 올바른 방법은 무엇입니까?

요청에 헤더와 3 개의 FORM 매개 변수가 URL 인코딩되어야합니다.

header = {'Content-type': 'application/x-www-form-urlencoded', 'Authorization':'Basic ' + encoded_string, 'Connection': 'Keep-Alive', 'Host':'host.host.com'} 

payload='grant_type=authorization_code&code=' + request.args['code'] + '&state=' + request.args['state'] + '&redirect_uri=http://xxx.xyz.com/request_listener' 

url = 'https://serviceprovider.xxx.com/auth/j_oauth_resolve_access_code' 

response = requests.post(url, data=payload, headers=header, verify=False) 

나는 responsecontent 또는 text을 반환 할 때, 나는 빈 문자열을 얻을 : 이것은 내가 뭐하는 거지입니다. 그러나 실제 response 개체를 인쇄 할 때 <Response [200]>이라고 표시되지만 실제로 200 OK이면 POST도 내가 지정한 redirect_uri로 이동해야하며 거기에 알림을 받게됩니다.

이런 일은 일어나지 않으며 나는 왜 그런지 신비 스럽다.

+0

http://docs.python.org/3/library/urllib.request.html#module-urllib.request –

+0

시도 할 사항 : 'curl'을 사용하여 수동으로 요청을 구성하고, 유효한 요청의 내용이 무엇인지 알아야합니다. 이것이 작동하면 파이썬에서 요청을 작성하거나 전달하는 방식에 문제가 있음을 알게됩니다. 'payload'를 문자열이 아닌 dict로 구성하십시오. 서버에 보내기 전에 요청 상태를 조사 할 수 있도록 준비된 요청을 작성하십시오. –

답변

5

코드가 요청 라이브러리와 싸우고 있습니다 : 요청은 당신을 위해 많은 것을 할 것입니다.

먼저 양식 데이터를 직접 인코딩하지 말고 요청에서 @ flyer 's answer와 같은 data에 사전을 제공하면됩니다.

이렇게하면 요청에서 Content-Type 헤더도 올바르게 설정되므로 사용자가 필요하지 않습니다. 또한 Connection 헤더를 보내지 마세요. 요청에 의해 관리됩니다. Host 헤더에도 동일하게 적용됩니다. Host 헤더를 보내면 문제가 발생할 수 있습니다.

마지막으로 Authorization 헤더를 직접 설정하지 말고 요청에서 인증 자격 증명을 제공하여 요청을 수행하도록하십시오. 관용적 인 요청 코드는 다음과 같습니다 :

그래도 작동하지 않으면 페이로드 데이터가 좋지 않을 것으로 생각됩니다.

+1

또한 OP는 호스트 헤더가 리디렉션되지 않은 경우 호스트 헤더가 보존된다고 생각할 수 있습니다. –

+0

헤더에 base64에 클라이언트 ID를 포함 시켜야만 제거 할 수 있었지만 다른 모든 것은 제거했습니다. payload 데이터를 dict로 변경했지만 요청이 실패하더라도 200 OK를 받았습니다. 이 문제는 요청에 문제가 아닌 것으로 의심됩니다. – digerati32

+0

요청이 실패하는 것을 어떻게 알 수 있습니까? – Lukasa

3

두 가지 실수가있는 것으로 보입니다.

첫 번째 : 데이터를 게시 할 때
이 데이터 형식은 다음과 같이해야한다 :

payload={ 
    'grant_type': 'authorization_code', 
    'code': request.args['code'], 
    'state': request.args['state'], 
    'redirect_uri': 'http://xxx.xyz.com/request_listener', 
} 

두 번째 :
Requests 자동으로 HTTPS 요청에 대한 SSL 인증서를 확인할 수 있으며 verify=True을 설정 기본값으로 verify=False으로 설정하면 ssl 확인을 무시한다는 의미입니다. 그건 네가 원하는게 아닐거야. 여기에 있습니다 doc

+0

서버 인증서에 서명 문제가있어서 '확인'이 False로 설정된 이유입니다. 페이로드를 dict로 변경하면 400 오류가 발생합니다. 요청이 구문 상 올바르지 않다고합니다. – digerati32

+0

@ digerati32, 요청 하시려는 전체 URL을 제공 할 수 있습니까? – flyer

관련 문제