Google OAuthGetRequestToken 返回"signature_invalid"



尝试数小时获取请求令牌使用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(它们应该是不同的),基本字符串几乎是相同的。

谁知道我做错了什么?

更新11/20/2011认为这可能是我的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相当一段时间了,现在目标URL路径前缀设置为http://www.embeddedanalytics.com/authsubsuccess.html。现在,当我转到管理域部分时,它声明我的oAuth消费者密钥是www.embeddedanalytics.com。这可能是个问题。在基于web的应用程序注册文档中,它声明:

如果你使用OAuth接口,这个URL("目标URL路径前缀")必须匹配oauth_consumer_key参数

在我的情况下,我有一个目标URL不同于我的oauth_consumer_key。这有问题吗?我使用www.embeddedanalytics.com作为游乐场中的consumer_key,它可以工作。我不想弄乱目标URL,因为它目前正在与我的AuthSub授权一起使用。

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

如果您使用HMAC-SHA1方法,Consumer SecretToken Secret将被用来签署您的请求。您的应用程序和Google都知道这两个秘密参数,它们的作用就像对称加密算法中的秘密密钥。

为了使用RSA-SHA1方法,然而,你应该已经上传你的Public Key到服务器(谷歌服务器)在您的应用程序的注册过程中。之后,您将使用Private Key对OAuth请求进行签名。在您的情况下,由于您还没有注册您的应用程序,谷歌不知道您的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后,可以按下授权按钮。这将重定向到谷歌的登录页面(如果您没有登录),然后到您授予访问应用程序的页面。通过授予访问权,您将带着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参数如何工作来签署请求。这可能是问题的原因。阅读这篇文章了解更多信息。

进一步阅读:

  • 管理OAuth密钥和秘密
  • 网上申请注册

这里是google。很长一段时间没有回答OAuth 1的问题了,因为每个人都转向了OAuth 2(你也应该这样做),但我将尝试通过无效签名错误的常见怀疑:

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

顺便说一下,如果你必须使用OAuth 1,你应该使用HMAC-SHA1,除非你有一个很好的理由使用RSA-SHA1。

相关内容

  • 没有找到相关文章

最新更新