【发布时间】:2012-03-18 01:48:32
【问题描述】:
我正在尝试通过 Google .Net GData 客户端库生成 OAuth 访问令牌。我一直在使用http://code.google.com/apis/gdata/docs/auth/oauth.html 中的说明作为指导,并且一切正常,直到我尝试调用OAuthUtil.GetAccessToken( parameters ),此时我收到“(400)错误请求”网络异常。
不幸的是,它没有告诉我任何关于为什么这是一个糟糕的请求。所以,我对此有点困惑。我唯一的想法是,因为我使用的是localhost url,所以它不起作用(尽管我已经在 Google API 控制台中注册了该 url,而且似乎可以这样做)。
任何想法我在这里做错了什么以及我应该做些什么来使它正确?
OAuthParameters 对象是这样构造的(敏感数据已被审查,希望不会让人难以回答):
BaseProperties:
oauth_consumer_key: <CLIENT_KEY>,
oauth_nonce: <NONCE>
oauth_signature_method: HMAC-SHA1
oauth_timestamp: 1330440325
oauth_token: <TOKEN>
oauth_verifier: <VERIFIER>
Callback: "http://localhost:57381/subscription_auth.aspx?c=google.calendar"
ConsumerKey: <CLIENT_KEY>
ConsumerSecret: <CLIENT_SECRET>
ExtraProperties
oauth_consumer_secret: <CLIENT_SECRET>
scope: https://docs.google.com/calendar/feeds/
oauth_callback: http://localhost:57381/subscription_auth.aspx?c=google.calendar
Nonce: <NONCE>
Scope: "https://docs.google.com/calendar/feeds/"
Signature: NULL
SignatureMethod: "HMAC-SHA1"
Timestamp: "1330440325"
Token: <TOKEN>
TokenSecret: NULL -- No Token Secret was returned from the callback.
Verifier: <VERIFIER>
这会转化为 Web 响应的标头,如下所示:
Authorization: OAuth oauth_version="1.0",
oauth_nonce=<NONCE>,
oauth_timestamp="1330441324",
oauth_consumer_key=<CLIENT_KEY>,
oauth_verifier=<VERIFIER>,
oauth_token=<TOKEN>,
oauth_signature_method="HMAC-SHA1",
oauth_signature=<SIGNATURE>
(为便于阅读添加了换行符)
注意:上述编辑值在与 GData 代码相关的地方被正确编码。
请求的uri是:https://www.google.com/accounts/OAuthGetAccessToken
根据位于此处的类,错误发生在第 186 行:http://code.google.com/p/google-gdata/source/browse/trunk/clients/cs/src/core/oauthutil.cs?r=1123
【问题讨论】:
-
OAuth 请求的 HTTP 响应代码:oauth.net/core/1.0a/#http_codes
-
使用 fiddler 来检查 http 响应(应该有一个错误代码/说明为什么在标题或正文中得到 400)或处理 HttpWebException 并检查那里的响应。跨度>
-
请向我们展示创建 OAuthParameters 对象并请求令牌的实际代码。
-
嗯,不幸的是我从来没有找到解决这个问题的方法——我们最终使用了不同客户端库附带的 v3 API。根据我的经验,通过使用这些 API,关键是使用 Fiddler 或 Wireshark 之类的东西并检查原始请求。请特别注意传递了哪些参数以及它们的格式是否正确(例如,我们遇到了日期格式问题)。
-
在仔细阅读 Barry 的回答后,我注意到我们用于 SCOPE 参数的 URL 在某种程度上是 Google Docs 和 Google Calendar 的混搭 - 这可能是问题所在.因此,如果您遇到类似问题,请务必仔细分析参数中的值。很遗憾,Google 不会确切地告诉您您做错了什么,因此需要您代表您进行一些仔细的调查。