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

Posted

技术标签:

【中文标题】Google App Engine OAuth 端点在生产中抛出 400【英文标题】:Google App Engine OAuth endpoints throwing 400 in production 【发布时间】:2011-08-21 18:09:42 【问题描述】:

我使用 Python 为 Google App Engine 实现了 experimental OAuth support,并让它在本地工作,但是当我部署到 apppot 时,端点会抛出 400。

例如,url http(s)://my-app.appspot.com/_ah/OAuthGetRequestToken 返回 400,但在本地,该 url 模式的行为符合预期。

我已经尝试过 http 和 https,并假设 apppot 处理 ssl 证书。

更新

我一直在使用OAuth Playground 来测试我的代码。尽管有文档,但似乎需要注册您的应用程序。前往here 获取有关如何注册的说明。根据注册过程中的文档,在 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 的原因有两个。首先,该应用未注册。谷歌的文档说它是可选的,但显然情况并非如此。其次,请求没有正确签署。 这是测试 OAuth 请求的出色调试工具:Oauth Playground

【问题讨论】:

您是否尝试转储(或记录)400 响应文本?通常所有的服务提供商都会在 400 代码中给出更有意义的完整信息? 不幸的是,响应文本是标准的 400 描述,并且仪表板没有记录对三个 OAuth 端点中的任何一个的请求(我认为这意味着请求正在我的应用程序范围之外处理) . 你只有27个rep,+200rep怎么样? 因为它已经把你的代表拿走了。在发布此赏金之前,我有 227 个。 【参考方案1】:

您必须注册您的域才能让 OAuth 用于生产环境。

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

自 1 月以来没有注册就无法使用。

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

【讨论】:

@eduardocereto - 是的,这个应用程序没有注册,因为它是可选的,并且它在 Google App Engine 上(并且验证是自动的,比如域注册)。我现在就注册。 . . 我得到了一个更具体的错误,“签名无效”。签名是从签名基本字符串创建的,在我的例子中是“7DYB6MJ2s-IQcd7VJYJUmcct”。我是否误解了签名创建? 问题最终是应用未注册(他们需要更新文档)并且请求未正确签名。我发现了一个很棒的调试工具,可以在发送 OAuth 请求时获得更详细的错误消息:googlecodesamples.com/oauth_playground 我认为你不需要签名。我不签署我的 oAuth 电话。但是,当然,如果您选择签名,则应正确签名。 您在使用 Google App Engine 吗?【参考方案2】:

它是哪种请求方法?在dev_appserver_oauth.py 我看到了:

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

所以它只适用于GETPOST 请求。

【讨论】:

这是一个 GET。它在本地工作(您正在查看 DEV_appserver_oauth.py),但在我部署到 apppot 时却不行。 好的,我在 SDK 中寻找线索,这是我找到的唯一 400 个。所以也许这是一个生产错误。 这也是我目前唯一的结论,随着 I/O 的进行,我怀疑我很快就会找到答案;)【参考方案3】:

首先确保您已在应用程序设置中启用联合登录。

根据您的描述,您可能只是正在执行对/_ah/OAuthGetRequestToken 的直接 GET 请求,而没有任何其他必需的 oAuth 参数。这将在 dev_appserver 上运行,因为它只是 oAuth 的一个模型,可以让您充实您的代码。

请参阅OAuthGetRequestToken description page 中列出的参数,了解需要什么以及如何处理签名。我相信你可以忽略 scope 的 GAE

【讨论】:

我正要询问范围,因为我们使用 OAuth 将请求签名到用户 API。我会测试一下,谢谢。 来自文档:“App Engine 不支持范围和 xoauth_displayname 参数。请求的范围是整个应用程序。”

以上是关于Google App Engine OAuth 端点在生产中抛出 400的主要内容,如果未能解决你的问题,请参考以下文章

使用 OAuth 2.0 Google App Engine 刷新访问令牌

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

如何使用 OAuth 使用 Facebook 帐户登录 Google App Engine 的 Java 示例

Google App Engine 烧瓶 SSL 和 OAuth2 问题

如何使用 Google API Explorer 通过 OAuth 测试我自己的 App Engine Endpoints?

如何通过 Google Drive 和 App Engine SDK 使用 Oauth2 服务帐户