2012-09-13 2 views
3

저는 AppEngine 서블릿에 액세스하는 Delphi 기반 PC 응용 프로그램을 작성하고 있습니다. OAuth 1.0 댄스를 사용하여 사용자를 인증하고 응용 프로그램의 제한된 부분에 대한 액세스를 허용하려고합니다. 브라우저를 사용하고 Google 사용자 인증을 통해 제한된 서블릿에 액세스 할 수 있습니다. 저는 이제 춤을 구현하려고합니다. OAuthGetRequestToken을 사용하여 성공적으로 토큰 및 토큰 보안을 가져옵니다.AppEngine 오류 400 액세스 토큰 요청시

Key := 'XXXX.appspot.com'; 
Secret := 'YYYY'; 
URL := 'https://XXXX.appspot.com/_ah/OAuthGetRequestToken'; 
Consumer := TOAuthConsumer.Create(Key, Secret); 
HMAC := TOAuthSignatureMethod_HMAC_SHA1.Create; 
ARequest := TOAuthRequest.Create(URL); 
ARequest := ARequest.FromConsumerAndToken(Consumer, nil, URL,'','oob',''); 
ARequest.Sign_Request(HMAC, Consumer, nil,true); 
URL := URL + '?' + ARequest.GetString; 
idHTTP1.Get(URL,ms); 
ARequest.Destroy; 
HMAC.Destroy; 
Consumer.Destroy; 

GET 요청과 응답은 다음과 같이 :

GET /_ah/OAuthGetRequestToken HTTP/1.1 
Host: XXXX.appspot.com 
Accept: */* 
Authorization: OAuth oauth_version="1.0", oauth_nonce="1511ec6d98e5b89c561b1af4b3022476", oauth_timestamp="1347534557", oauth_consumer_key="XXXX.appspot.com", oauth_callback="oob", oauth_signature_method="HMAC-SHA1", oauth_signature="JPSgMsipsLumldKsca8SA8gDXgw%3D" 

HTTP/1.1 200 OK 
Date: Thu, 13 Sep 2012 11:09:18 GMT 
Content-Type: text/html 
Server: Google Frontend 
Content-Length: 88 
oauth_token=4%2FY4ReEZt9v8IYHJ_4WnZYkzurXOgw&oauth_token_secret=S9150fuyvo_jjr43Cd47CPzY 

다음으로, 토큰을 승인합니다.

URL := 'https://inksureauth.appspot.com/_ah/OAuthAuthorizeToken?oauth_token='+TOAuthUtil.urlEncodeRFC3986(Token.Text); 
IdHTTP1.Get(URL,ms); 

로그인을 위해 Google 웹 페이지로 리디렉션됩니다. 콜백에 'oob'이라고 말한대로, 내가 복사 한 웹 페이지에 인증 코드가 전송됩니다.

마지막으로 액세스 토큰에 대한 토큰 교환을 시도합니다. 여기서 나는 실패한다.

GET /_ah/OAuthGetAccessToken?oauth_version=1.0&oauth_nonce=4A86BEECE494C25AF94882F74DEE6231&oauth_timestamp=1347545383&oauth_consumer_key=XXXX.appspot.com&oauth_verifier=yGEhCENYOlni2ayo8aNckyPG&oauth_token=4%2FEKGFo9i2wmuMGcBLmbmQhqDba0z4&oauth_signature_method=HMAC-SHA1&oauth_signature=2ZwRvGp8LnXenTXrjYo5%2FtFHW30%3D HTTP/1.1 

그리고 응답 :

URL := 'https://XXXX.appspot.com/_ah/OAuthGetAccessToken'; 
Key := 'XXXX.appspot.com'; 
Secret := 'YYYY'; 
Consumer := TOAuthConsumer.Create(Key, Secret); 
ARequest := TOAuthRequest.Create(URL); 
AToken := TOAuthToken.Create(TOAuthUtil.urlEncodeRFC3986(Token.Text), TokenSecret.Text); 
ARequest.HTTPURL := URL; 
ARequest := ARequest.FromConsumerAndToken(Consumer,AToken , URL,'','','VERIFICATION CODE FROM WEB PAGE'); 
HMAC := TOAuthSignatureMethod_HMAC_SHA1.Create; 
ARequest.Sign_Request(HMAC, Consumer, AToken,true); 
URL := URL + '?' + ARequest.GetString; 
IdHTTP1.Disconnect; 
IdHTTP1.Get(URL,ms); 
HMAC.Destroy; 
ARequest.Destroy; 
Consumer.Destroy; 

get 명령은 다음과 같습니다

HTTP/1.1 400 Bad Request 
Date: Thu, 13 Sep 2012 14:09:44 GMT 
Content-Type: text/html; charset=UTF-8 
Server: Google Frontend 
Content-Length: 273 


<html><head> 
<meta http-equiv="content-type" content="text/html;charset=utf-8"> 
<title>400 Bad Request</title> 
</head> 
<body text=#000000 bgcolor=#ffffff> 
<h1>Error: Bad Request</h1> 
<h2>Your client has issued a malformed or illegal request.</h2> 
<h2></h2> 
</body></html> 

내가 같은 응용 프로그램에 액세스 할 수 OAuth는 놀이터를 사용하고이 액세스를 검색에 성공 키. 놀이터의 요청 매개 변수를 내 응용 프로그램에서 생성 된 매개 변수와 비교했는데 호환이 가능합니다. 놀이터에서 생성 된 요청과 일치 된 서명에 서명 기능을 사용했습니다. 마지막 단계에서 실패 할 수있는 다른 이유는 무엇입니까? "클라이언트가 기형 또는 불법 요청을 한 것"이상으로 인증 서버에서보다 유익한 응답을받을 수 있습니까?

업데이트 : 내 애플리케이션을 사용하여 Google 캘린더에 대한 액세스 토큰을 성공적으로 검색했습니다. 동일한 코드를 사용하여 AppEngine 응용 프로그램으로 다시 변경하고 GetAccessToken 단계에서 실패합니다.

답변

0

Google은 Oauth 2.0으로 이전했습니다. 현재의 OAuth 2.0 클라이언트 인증 솔루션을 찾을 수 있습니다 : 인디에 대한

https://github.com/lordcrc/IndySASLOAuth2

간단한 OAuth2를 SASL 인증을.

Delphi REST 클라이언트 라이브러리를 사용합니다.

델파이 XE6에서 테스트되었습니다.

Apache 2.0 라이센스로 사용 허가 됨