2012-09-13 93 views
3

我正在編寫一個基於Delphi的PC應用程序,它訪問AppEngine servlet。我正在嘗試使用OAuth 1.0 dance來驗證用戶並允許訪問應用程序的受限制部分。 我可以使用瀏覽器訪問受限制的servlet,並通過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網頁進行登錄。正如我所說的「回撥」,我會在我複製的網頁上收到驗證碼。

最後,我嘗試獲取交換訪問令牌的令牌。我在這裏失敗了。

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命令如下:

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 

和響應:我用的OAuth操場訪問相同的應用程序

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> 

,併成功地檢索訪問鍵。我將遊樂場的請求參數與我的應用程序生成的參數進行比較,並且它們是兼容的。我使用我的簽名功能簽署了操場生成的請求並匹配簽名。最後一步失敗會有什麼其他原因? 除了「您的客戶發出格式錯誤或非法請求」之外,是否可以從驗證服務器獲得更多信息回覆?

更新:我已經使用我的應用程序成功檢索到Google日曆的訪問令牌。使用相同的代碼,我切換回AppEngine應用程序,並在GetAccessToken步驟失敗。

回答

0

谷歌同時轉移到Oauth 2.0。你可以在這裏找到的OAuth 2.0客戶端身份驗證解決方案:

https://github.com/lordcrc/IndySASLOAuth2

簡單的OAuth2 SASL驗證了印。

使用Delphi REST客戶端庫。

在Delphi XE6上測試。

根據Apache 2.0許可證授權

相關問題