Google OAuthGetRequestToken返回“signature_invalid”

时间:2011-11-16 04:31:01

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

尝试使用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追踪我的电话。它返回Signature基本字符串:

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_timestamp oauth_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 一段时间了,目标网址路径前缀设置为 http://www.embeddedanalytics.com/authsubsuccess.html 。现在,当我进入Manage Domains部分时,它表明我的oAuth消费者密钥是 www.embeddedanalytics.com 。现在也许这可能是一个问题。在Registration for Web-Based Applications文档中声明:

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

在我的情况下,我的目标网址与我的oauth_consumer_key不同。这可能是个问题吗?我在操场上使用 www.embeddedanalytics.com 作为consumer_key,它可以正常运行。我不想弄乱目标网址,因为它目前正在与我的AuthSub授权一起使用。

2 个答案:

答案 0 :(得分:3)

我认为您尚未向Google注册您的申请域名。因此,除非您提供consumer secret作为anonymousoauth_consumer_key,否则将拒绝您用于签署请求的任何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. 按“请求令牌”按钮
  5. 结果:

    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的登录页面(如果您尚未登录),然后再转到您授予应用程序访问权限的页面。通过授予访问权限,您将返回带有callback url的游乐场中的verifier code。按“访问令牌”按钮,即可获得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了解详情。

    进一步阅读:

答案 1 :(得分:2)

Googler在这里。在很长一段时间内没有提出过OAuth 1问题,因为每个人都在转向OAuth 2(你也应该这样做)但是我会尝试通过无效签名错误的常见嫌疑人:

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

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