【问题标题】:Google OAuthGetRequestToken returns "signature_invalid"Google OAuthGetRequestToken 返回“signature_invalid”
【发布时间】:2011-12-30 02:41:03
【问题描述】:

尝试使用 Google OAuthGetRequestToken 获取 请求令牌 数小时,但始终返回“signature_invalid”。

对于测试,我使用oAuth Playground 成功请求令牌。结果如下:

签名基本字符串

  GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dhttp%253A%252F%252Fgooglecodesamples.com%252Foauth_playground%252Findex.php%26oauth_consumer_key%3Dwww.embeddedanalytics.com%26oauth_nonce%3D56aa884162ed21815a0406725c79cf79%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1321417095%26oauth_version%3D1.0%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fanalytics%252Ffeeds%252F

请求/响应

GET /accounts/OAuthGetRequestToken?scope=https%3A%2F%2Fwww.google.com%2Fanalytics%2Ffeeds%2F HTTP/1.1
Host: www.google.com
Accept: */*
Authorization: OAuth oauth_version="1.0", oauth_nonce="56aa884162ed21815a0406725c79cf79", oauth_timestamp="1321417095", oauth_consumer_key="www.embeddedanalytics.com", oauth_callback="http%3A%2F%2Fgooglecodesamples.com%2Foauth_playground%2Findex.php", oauth_signature_method="RSA-SHA1", oauth_signature="qRtorIaSFaQdOXW1u6eMQlY9LT2j7ThG5kgkcD6rDcW4MIvzluslFgYRNTuRvnaruraNpItjojtgsrK9deYRKoHBGOlU27SsWy6jECxKczcSECl3cVAcjk7dvbywFMDkgi1ZhTZ5Q%2BFoD60HoVQUYnGUbOO0jPXI48LfkiA5ZN4%3D"

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Wed, 16 Nov 2011 04:18:15 GMT
Expires: Wed, 16 Nov 2011 04:18:15 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 118
Server: GSE

oauth_token=4%2FmO86qZzixayI2NoUc-hewC--D53R&oauth_token_secret=r0PReF9D83w1d6uP0nyQQm9c&oauth_callback_confirmed=true

我正在使用 Fiddler 来跟踪我的通话。它返回签名基本字符串:

GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken&oauth_callback%3Dhttp%253A%252F%252Fgooglecodesamples.com%252Foauth_playground%252Findex.php%26oauth_consumer_key%3Dwww.embeddedanalytics.com%26oauth_nonce%3Dl9Jydzjyzt2fJfM3ltY5yrxxYy2uh1U7%26oauth_signature_method%3DRSA-SHA1%26oauth_timestamp%3D1321417107%26oauth_version%3D1.0%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fanalytics%252Ffeeds%252F

除了 oauth_timestampoauth_nonce(应该不同)之外,基本字符串几乎相同。

有人知道我做错了什么吗?

2011 年 11 月 20 日更新 考虑到我的 RSA-SHA 签名可能有问题,我已经尝试了 HMAC-SHA。它给出了相同的结果。我认为包含 Fiddler 结果可能是有益的(我添加了回车以使其格式更好)。

GET https://www.google.com/accounts/OAuthGetRequestToken?
scope=https%3A%2F%2Fwww.google.com%2Fanalytics%2Ffeeds%2F HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Authorization: OAuth oauth_version="1.0",
oauth_nonce="7C4C900EAACC9C7B62E399A91B81D8DC",
oauth_timestamp="1321845418",
oauth_consumer_key="www.embeddedanalytics.com",
oauth_signature_method="HMAC-SHA1",
oauth_signature="ows%2BbFTNSR8jVZo53rGBB8%2BfwFM%3D"
Host: www.google.com
Accept: */*
Accept-Encoding: identity

回应

HTTP/1.1 400 Bad Request
Content-Type: text/plain; charset=UTF-8
Date: Mon, 21 Nov 2011 03:16:57 GMT
Expires: Mon, 21 Nov 2011 03:16:57 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 358
Server: GSE

signature_invalid
base_string:GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetRequestToken
&oauth_consumer_key%3Dwww.embeddedanalytics.com
%26oauth_nonce%3D7C4C900EAACC9C7B62E399A91B81D8DC
%26oauth_signature_method%3DHMAC-SHA1
%26oauth_timestamp%3D1321845418
%26oauth_version%3D1.0
%26scope%3Dhttps%253A%252F%252Fwww.google.com%252Fanalytics%252Ffeeds%252F

2011 年 11 月 24 日更新 - 我想根据 @Meysam 和 @Bob Aman 的回答添加更多信息。首先,我的域已在 Google 正确注册。我使用 AuthSub 已经有一段时间了,将 Target URL path prefix 设置为 http://www.embeddedanalytics.com/authsubsuccess.html。现在,当我转到“管理域”部分时,它指出我的 oAuth 消费者密钥是 www.embeddedanalytics.com。现在也许这可能是一个问题。在Registration for Web-Based Applications 文件中指出:

如果您使用的是 OAuth 界面,则此 URL(“目标 URL 路径前缀”)必须与 oauth_consumer_key 参数的值匹配

就我而言,我的目标 URL 与我的 oauth_consumer_key 不同。这会是个问题吗?我在操场上使用 www.embeddedanalytics.com 作为 consumer_key,它可以工作。我不想弄乱目标 URL,因为它目前正在与我的 AuthSub 授权一起使用。

【问题讨论】:

  • @M Schenkel:虽然我为 oauth 使用了不同的库,但在使用 Google 时遇到了同样的问题。能够获得验证码,但是在尝试获取访问令牌时,它给出了同样的错误,但仍然不知道出了什么问题.
  • 强烈建议您改用 OAuth 2。更容易使用。不涉及签名。
  • 游乐场是否支持 OAuth 2?看来不是;当您向它发出请求时,标头是 oauth_version="1.0"。如果没有,将来是否有计划支持它?

标签: oauth google-api digital-signature access-token


【解决方案1】:

这里是 Google 员工。很长一段时间没有回答 OAuth 1 问题,因为每个人都在转向 OAuth 2(你也应该),但我会尝试解决通常怀疑无效签名错误的问题:

  • 您的服务器时钟可能有误。有一个时间戳组件,它需要与我们的非常接近。尝试根据主要参考时间服务器之一更新您的时钟。会发生这种情况,但这是一个不常见的问题。
  • 根据您使用的 OAuth 客户端的低级别,您可能忘记提供用于生成签名的部分密钥。密钥有两部分,用冒号分隔,IIRC。在协议的某些部分,只需要一半,但对于协议的其他部分,你需要两者。我见过有人在需要时只提供前半部分的情况。实际上,我想我自己也犯过几次这个错误。
  • 在您的情况下可能不是问题,因为您甚至没有通过请求令牌,但 OAuth 1 要求您签署 URI 查询参数。否则会导致签名基字符串不匹配,从而导致签名无效。
  • 到目前为止,最常见的问题是编码不当。这通常表现为有时有效但有时失败的签名,因为有时你很幸运,没有什么需要编码。我怀疑这就是@Meysam 遇到的问题,因为他的评论是他又按了几次按钮,然后突然就起作用了。

顺便说一句,如果您必须使用 OAuth 1,则应该使用 HMAC-SHA1,除非您有充分的理由使用 RSA-SHA1。

【讨论】:

  • 谢谢 - 我会消化所有这些并进行更多尝试。我最近确实从 RSA 转移到了 HMAC。关于时钟,我认为它设置正确。我也认为可能是这样,并尝试在这里更改一个小时,那里一个小时。当我这样做时,它响应“时间太远了”。
  • 关于您的第四条评论,我在使用 Playgounrd 时也遇到过一种情况,我输入了所有信息,但它响应无效签名。但是再次单击该按钮,我得到了一个有效的令牌。操场没有正确编码吗?我还想补充一点,我的密钥中有加号 (+)。这可能是罪魁祸首——所有其他字符都是简单的数字/字母。我在原始帖子中添加了一些附加信息。感谢您的帮助。
  • 游乐场在某一时刻确实存在一些编码问题,但我认为它们已得到修复。可能是回归。
  • 现在正在考虑实施 oAuth2。
  • 虽然这不是问题的实际技术答案 - 我意识到迁移到 oAuth2 是真正的答案。
【解决方案2】:

我假设您尚未向 Google 注册您的应用程序域。因此,除非您提供anonymous 作为您的oauth_consumer_keyconsumer secret,否则无论您使用什么consumer secret 来签署您的请求(在HMAC-SHA1 方法中)都将被拒绝。这样一来,Google 就会将您识别为未注册的应用程序,并成功地向您返回 Request Token

如果您使用HMAC-SHA1 方法,Consumer SecretToken Secret 将用于签署您的请求。这两个秘密参数对于您的应用程序和 Google 来说都是已知的,并且就像对称加密算法中的秘密密钥一样。

但是,为了使用RSA-SHA1 方法,您应该已经在应用程序的注册过程中将您的Public Key 上传到服务器(Google 服务器)。之后,您将使用您的 Private Key 来签署您的 OAuth 请求。在您的情况下,由于您尚未注册您的应用程序,Google 不知道您的Public Key,因此使用RSA-SHA1 方法以未知的Private Key 签署您的请求是没有用的。

出于性能原因,第一种方法通常优于RSA-SHA1 方法。 (对称加密比非对称加密更快)

所以这就是我可以在OAuth Playground 中成功获得Request Token 的方法:

  1. 将“oauth_consumer_key”设置为anonymous(除非您有 注册您的应用程序并拥有一个真实的Consumer Key)
  2. 将“消费者秘密”设置为anonymous(除非您已注册您的 申请并拥有真正的Consumer Secret)
  3. 选择https://www.google.com/analytics/feeds/作为请求范围。
  4. 按“请求令牌”按钮

结果:

GET /accounts/OAuthGetRequestToken?scope=https%3A%2F%2Fwww.google.com%2Fanalytics%2Ffeeds%2F HTTP/1.1
Host: www.google.com
Accept: */*
Authorization: OAuth oauth_version="1.0", oauth_nonce="116d4df85e784f51cf40f0bc3a967883", oauth_timestamp="1322083727", oauth_consumer_key="anonymous", oauth_callback="http%3A%2F%2Fwww.googlecodesamples.com%2Foauth_playground%2Findex.php", oauth_signature_method="HMAC-SHA1", oauth_signature="vVxpbtHlTR%2BJ1yT%2BYS1HOvRzhOs%3D"

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Wed, 23 Nov 2011 21:28:47 GMT
Expires: Wed, 23 Nov 2011 21:28:47 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 118
Server: GSE

oauth_token=4%2F7E_YtZFHuKFPbuAGuCzyj2AsHcha&oauth_token_secret=NHZBJCj2BPxR2HQZhCTwdq2A&oauth_callback_confirmed=true

现在您已经获得了oauth_tokenoauth_token_secret,您可以按下授权按钮。这会将您重定向到 Google 的登录页面(如果您未登录),然后重定向到您授予应用程序访问权限的页面。通过授予访问权限,您将使用verifier code 回到操场上的callback url。按“访问令牌”按钮,您将获得access token

GET /accounts/OAuthGetAccessToken HTTP/1.1
Host: www.google.com
Accept: */*
Authorization: OAuth oauth_version="1.0", oauth_nonce="c222a88cc9f027430b239f4cc6f3f154", oauth_timestamp="1322084080", oauth_consumer_key="anonymous", oauth_verifier="TA6vWcDJC51A9YwMNfmUzmUQ", oauth_token="4%2F7E_YtZFHuKFPbuAGuCzyj2AsHcha", oauth_signature_method="HMAC-SHA1", oauth_signature="q9M%2BjeHNxB2ONPd1DPMn6GriUC8%3D"

HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Date: Wed, 23 Nov 2011 21:34:40 GMT
Expires: Wed, 23 Nov 2011 21:34:40 GMT
Cache-Control: private, max-age=0
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Length: 103
Server: GSE

oauth_token=1%2Fxy49iwSQEcqSDbo3cKO-UuPLqvt9qKFit9vaLqR6P-M&oauth_token_secret=IJWB1CVSQfYJJPrf9jXv6SS8

*注意:有一次,我也收到了signature_invalid 响应,即使我输入了匿名凭据。但是在再次尝试并再按一两次“请求令牌”按钮后,我成功了。我认为这应该是由于noncetimestamp 参数是如何对请求进行签名的。这可能是问题的原因。阅读this article了解更多信息。

进一步阅读:

【讨论】:

  • @@meysam - 非常感谢您的所有努力。如果有办法分割积分,我会把部分赏金给你。不幸的是,“googler”的回答促使我转向 oAuth 2.0
  • @M Schenkel 没问题老兄:)
猜你喜欢
  • 2017-10-24
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多