尝试使用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授权一起使用。
答案 0 :(得分:3)
我认为您尚未向Google注册您的申请域名。因此,除非您提供consumer secret
作为anonymous
和oauth_consumer_key
,否则将拒绝您用于签署请求的任何consumer secret
(使用HMAC-SHA1方法)。这样,Google会将您识别为未注册的应用,并会成功返回Request Token
。
如果您使用HMAC-SHA1
方法,Consumer Secret
和Token Secret
将用于签署您的请求。这两个秘密参数对于您的应用程序和Google都是已知的,并且在对称加密算法中就像一个密钥。
但是,为了使用RSA-SHA1
方法,您应该在申请注册过程中将Public Key
上传到服务器(Google服务器)。之后,您将使用Private Key
签署OAuth请求。在您的情况下,由于您尚未注册申请,因此Google无法识别您的Public Key
,因此使用RSA-SHA1
方法对未知Private Key
的请求进行签名是没有用的。
出于性能原因,第一种方法通常比RSA-SHA1
方法更受欢迎。 (对称加密比非对称加密快)
所以这就是我在OAuth Playground中成功获得Request Token
的方式:
anonymous
(除非你有
注册了您的申请并拥有真实的Consumer Key
)anonymous
(除非您已经注册了
应用程序,并有一个真正的Consumer Secret
)结果:
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_token
和oauth_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
响应。但是在再次尝试并按下“请求令牌”按钮一次或两次之后我就完成了它。我认为这应该归因于nonce
和timestamp
参数如何用于签署请求。这可能是问题的原因。请阅读this article了解详情。
进一步阅读:
答案 1 :(得分:2)
Googler在这里。在很长一段时间内没有提出过OAuth 1问题,因为每个人都在转向OAuth 2(你也应该这样做)但是我会尝试通过无效签名错误的常见嫌疑人:
顺便说一句,如果你必须使用OAuth 1,你应该使用HMAC-SHA1,除非你有充分的理由去做RSA-SHA1。