Google App Engine OAuth 端点在生产中抛出 400 错误

16 投票
3 回答
2224 浏览
提问于 2025-04-16 17:17

我用Python为Google App Engine实现了一个实验性的OAuth支持,虽然在本地运行得很好,但一旦部署到appspot上,接口就返回了400错误。

比如,网址http(s)://my-app.appspot.com/_ah/OAuthGetRequestToken返回了400错误,而在本地,这个网址的表现是正常的。

我尝试过http和https,认为appspot会处理SSL证书的问题。

更新

我一直在使用OAuth Playground来测试我的代码。尽管有文档说明,但似乎注册你的应用是必须的。你可以点击这里查看注册的步骤。根据文档,在注册过程中,运行在App Engine上时不需要证书。不过,Playground显示的错误信息更详细——“签名无效”。如果我理解正确,签名是从一个签名基础字符串生成的。在这个情况下,我使用的基础字符串是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错误的原因有两个。首先,应用没有注册。虽然Google的文档说注册是可选的,但显然并不是这样。其次,请求没有正确签名。这里有一个很好的调试工具,可以用来测试你的OAuth请求:Oauth Playground

3 个回答

0

首先,确保你在应用设置中启用了联邦登录。

管理面板截图

根据你的描述,听起来你可能只是直接发送了一个GET请求到 /_ah/OAuthGetRequestToken,而没有包含oAuth所需的其他参数。这在开发服务器上是可以工作的,因为它只是oAuth的一个模拟,让你可以完善你的代码。

你可以查看OAuthGetRequestToken描述页面,了解需要哪些参数以及如何处理签名。不过,我认为对于GAE来说,你可以忽略 scope

0

这是什么请求方法呢?在 dev_appserver_oauth.py 文件里,我看到:

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

所以它只适用于 GETPOST 请求。

4

为了让OAuth在正式环境中正常工作,你必须注册你的域名。

虽然下面的文档说注册是可选的:http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html

但自从一月份以来,没有注册就无法正常使用。

请查看上面的链接,注册你的域名或应用程序。你不需要提交证书,这仍然是可选的。

撰写回答