2011-08-26 3 views
1

xauth 구현시 매우 이상한 오류가 발생합니다.암호에 "#"이 포함되어 있으면 XAuth가 실패합니다.

암호에 "#"이 있으면 실패합니다. 나는 원시 헤더를 스누핑, 그리고 여기 거의 정확하게 다른 찾고 넌스를 제외하고 작동하는 다른 응용 프로그램

내가 사용하고있는 코드와 동일한 모양 (그것은 중요합니까?) : http://pastie.org/2436098

--------MY LIBRARY :FAIL-------- 

POST /oauth/access_token HTTP/1.1 
Host: api.twitter.com 
User-Agent: onethingaday/1.0 CFNetwork/485.13.8 Darwin/10.7.0 
Authorization: OAuth oauth_nonce="70943970", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1314400256", oauth_consumer_key="fmYDyQZ1IRz6sYuhOAQbJQ", oauth_signature="1VYDQYL5WvkbovQggNUjuY9t%2Fvc%3D", oauth_version="1.0" 
Accept: */* 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 78 
Connection: keep-alive 
Proxy-Connection: keep-alive 

x_auth_mode=client_auth&x_auth_username=kkklllkkk1&x_auth_password=kkkk%23kkkk 


--------SNOOPING ANOTHER APP : SUCCESS-------- 

POST /oauth/access_token HTTP/1.1 
Host: api.twitter.com 
User-Agent: XAuthTwitterEngineDemo/1.0 CFNetwork/485.13.8 Darwin/10.7.0 
Content-Length: 78 
Content-Type: application/x-www-form-urlencoded 
Authorization: OAuth realm="", oauth_consumer_key="fmYDyQZ1IRz6sYuhOAQbJQ", oauth_signature_method="HMAC-SHA1", oauth_signature="mEyjwksg1NoaY2VMQBf70ZN3OhM%3D", oauth_timestamp="1314400386", oauth_nonce="4DF9C426-08F8-49FC-9E1B-576FDBDA8836", oauth_version="1.0" 
Accept: */* 
Accept-Language: en-us 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Proxy-Connection: keep-alive 

x_auth_mode=client_auth&x_auth_username=kkklllkkk1&x_auth_password=kkkk%23kkkk 

답변

2

대부분의 경우 서명 기반 문자열을 무시했습니다. 매개 변수를 작성하는 방법은 바로 가기를 사용하고 일부 단계를 변경하려고하는데 인코딩 수준이 누락 된 것 같습니다. 당신이 좋아하는 요소의 매개 변수 목록 구축하고 : 다음

E(k) + E('=') + E(v) 

다음, 결합, 인코딩 된 키 - 값 쌍의 문자열을 정렬

P_{i} + E('&') + P_{i + 1} 

처럼 모든 문자열을 결합을이 인코딩 수준이 골대를 벗어났습니다 왜냐하면 당신이 매개 변수에 해당하는 서명 기본 문자열의 부분에 대해 실제로 끝내기 위해서 (단순화를 위해 두 개의 키 - 값 쌍이 있다고 가정하기 때문입니다) :

E(E(k) + '=' + E(v) + '&' + E(k2) + '=' + E(v2)) 
= 
E(E(k)) + E('=') + E(E(v)) + E('&') + E(E(k2)) + E('=') + E(E(v2)) 

이것은 % 기호가 키와 값의 이스케이프 처리 된 문자로 이스케이프 처리되었으므로 #%23으로, 그 다음은 %2523으로 바뀌므로 E('%') = '%25'이기 때문입니다.

표준 단계별 지침을 따르는 경우 잘 수행해야합니다. 당신이 등가의 증거없이 표준에서 출발한다면, 당신은 길을 잃을 것입니다.

+0

놀라운 답변을 해주신 제레미에게 감사드립니다. 이걸 두 번 upvote 어떻게합니까? 내 구현을 해독하고 이것으로 끝내기 시작했습니다. http://code.google.com/p/oauthconsumer/wiki/UsingOAuthConsumer –

+0

은 표준에 관해서는 너무 똑똑하지 않으려 고합니다. –

관련 문제