2011-05-09 63 views
16

我使用Python爲Google App Engine實現了experimental OAuth support,並使其在本地工作,但端點在部署到appspot時拋出400。Google App Engine OAuth端點在生產中投擲400

例如,http(s)://my-app.appspot.com/_ah/OAuthGetRequestToken返回400,但本地URL模式的行爲與預期相同。

我已經嘗試了http和https,並假定appspot處理ssl證書。

UPDATE

我一直在使用OAuth Playground來測試我的代碼。儘管文檔,似乎註冊您的應用程序必需的。有關如何註冊的說明,請登錄here。根據註冊過程中的文檔,在App Engine上運行時不需要證書。遊樂場正在顯示錯誤的更多細節 - 「簽名無效」。如果我理解正確,簽名是從簽名基礎字符串生成的。在這種情況下,我使用基本字符串7DYB6MJ2s-IQcd7VJYJUmcct。

GET /accounts/OAuthGetRequestToken?scope=https%3A%2F%2Fmail.google.com%2Fmail%2Ffeed%2Fatom HTTP/1.1 
Host: www.google.com 
Accept: */* 
Authorization: OAuth oauth_version="1.0", oauth_nonce="168cfd60a93a46caa38dddfdcedd9de9", oauth_timestamp="1305315895", oauth_consumer_key="xxxxxxx.appspot.com", oauth_callback="http%3A%2F%2Fgooglecodesamples.com%2Foauth_playground%2Findex.php", oauth_signature_method="HMAC-SHA1", oauth_signature="4J5faUujE0VNaybyvFCiEPY7DQ8%3D" 

HTTP/1.1 400 Bad Request 
Content-Type: text/plain; charset=UTF-8 
Date: Fri, 13 May 2011 19:44:55 GMT 
Expires: Fri, 13 May 2011 19:44:55 GMT 
Cache-Control: private, max-age=0 
X-Content-Type-Options: nosniff 
X-XSS-Protection: 1; mode=block 
Content-Length: 451 
Server: GSE 

**signature_invalid** 
base_string:GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dhttp%253A%252F%252Fgooglecodesamples.com%252Foauth_playground%252Findex.php%26oauth_consumer_key%3Dxxxxxx.appspot.com%26oauth_nonce%3D168cf60a94caa38e2defdcedd9de9%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1305315895%26oauth_version%3D1.0%26scope%3Dhttps%253A%252F%252Fmail.google.com%252Fmail%252Ffeed%252Fatom 

最後更新

有兩件事情引起了400首先,應用程序未註冊。谷歌的文件說這是可選的,但顯然並非如此。其次,請求沒有正確簽署。 下面是一個極好的調試工具來測試您的OAuth請求:Oauth Playground

+0

您是否嘗試轉儲(或記錄)400響應文本?通常所有的服務提供商都會在400條代碼中給出更多含義的全面信 – Jeyara 2011-05-10 02:59:47

+0

不幸的是,響應文本是標準400描述,儀表板不記錄請求到任何三個OAuth端點(我認爲這意味着請求正在我的應用程序範圍外處理)。 – 2011-05-10 03:18:34

+0

你只有27個代表,你最近怎麼樣做+200代表? – contactmatt 2011-05-12 20:39:33

回答

4

您必須註冊您的域名,以使OAuth生產工作。

雖然下面的文檔指出,註冊是可選: http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html

在未加註冊一月以來的工作。

看看上面的鏈接並註冊你的域名/應用程序。您不需要提交證書,但這仍然是可選的。

+0

@eduardocereto - 是的這個程序沒有註冊的假設,它是可選的,並且它是在谷歌App Engine上(並且驗證是自動的,例如域名註冊)。我現在就註冊。 。 。 – 2011-05-13 18:02:59

+0

我能夠得到一個更具體的錯誤,「簽名無效」。簽名是從簽名基礎字符串創建的,在我的例子中是「7DYB6MJ2s-IQcd7VJYJUmcct」。我誤解了簽名創作嗎? – 2011-05-13 20:03:09

+0

這個問題最終導致應用程序未被註冊(他們需要更新他們的文檔)並且請求未被正確簽名。我發現了一個很好的調試工具,可以在發送OAuth請求時獲取更詳細的錯誤消息:http://googlecodesamples.com/oauth_playground/ – 2011-05-14 01:27:05

0

它是哪種請求方法?在dev_appserver_oauth.py我看到:

if method != 'GET' and method != 'POST': 
    outfile.write('Status: 400\r\n') 
    return 

所以它只會爲GETPOST請求工作。

+0

這是一個GET。它適用於本地(您正在查看DEV_appserver_oauth.py),但不能在部署到appspot時使用。 – 2011-05-10 14:00:39

+0

好吧,我在SDK中尋找線索,那是我找到的唯一的400。所以也許這是一個生產缺陷。 – moraes 2011-05-11 00:32:26

+0

這是我在這一點上的唯一結論,並且隨着I/O的進行,我懷疑我很快就能找到答案;) – 2011-05-11 12:59:34

0

首先確保您在應用程序設置中啓用了聯合登錄。

screenshot admin panel

從你的描述,它聽起來就像你可能只是沒有 OAuth的任何所需的其他參數來進行直接的GET請求/_ah/OAuthGetRequestToken。這將在dev_appserver上工作,因爲它只是oAuth的一個模型,讓你充實你的代碼。

請參閱OAuthGetRequestToken description page上列出的參數,瞭解需要什麼以及如何處理簽名。我相信你可以忽略scope GAE雖然

+0

由於我們使用OAuth向用戶簽署請求,因此我只是想詢問範圍API。我會測試一下,謝謝。 – 2011-05-13 18:05:37

+0

從文檔:「App Engine不支持範圍和xoauth_displayname參數。請求的範圍是整個應用程序。」 – 2011-05-13 20:01:21