저는 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 단계에서 실패합니다.