2

我在用 PHP 编写自己的 OAuth 库和包装类时犯了一个巨大的错误。一切都非常适合 Twitter 的 OAuth 实现,但我在为 Tumblr 和 Flickr 签署 access_token 步骤时失败了。

该步骤的唯一区别是现在我有 oauth_token 和 oauth_verifier 参数。我正在使用 Authorization 标头,我能想到的唯一问题是存在一些字符编码问题,但我不确定。

基本字符串(为清楚起见断开):

POST&
http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Faccess_token&
oauth_consumer_key%3Deeedfcd4c46a2c12080f58eb90a974d8
%26oauth_nonce%3D322190b47ca680d053338724ad1cc56d35d3e7b5
%26oauth_signature_method%3DHMAC-SHA1
%26oauth_timestamp%3D1322981994
%26oauth_token%3D72157628270097303-18aa378b4ab02af3
%26oauth_verifier%3Dec7811503fdd4380
%26oauth_version%3D1.0

这正是 Flickr 所期望的(他们在错误响应中这样告诉我),这让我相信签名是问题所在。

授权标头(为了清楚起见也打断了):

Authorization: OAuth
oauth_consumer_key="eeedfcd4c46a2c12080f58eb90a974d8", 
oauth_nonce="322190b47ca680d053338724ad1cc56d35d3e7b5",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1322981994",
oauth_token="72157628270097303-18aa378b4ab02af3",
oauth_verifier="ec7811503fdd4380",
oauth_version="1.0",
oauth_signature="LYJtgHetQWNKX3rtQlSs643FdWY%3D"

而 Flickr 的回应

oauth_problem=signature_invalid&
debug_sbs=POST&
    http%3A%2F%2Fwww.flickr.com%2Fservices%2Foauth%2Faccess_token&
    oauth_consumer_key%3Deeedfcd4c46a2c12080f58eb90a974d8
    %26oauth_nonce%3D322190b47ca680d053338724ad1cc56d35d3e7b5
    %26oauth_signature_method%3DHMAC-SHA1
    %26oauth_timestamp%3D1322981994
    %26oauth_token%3D72157628270097303-18aa378b4ab02af3
    %26oauth_verifier%3Dec7811503fdd4380
    %26oauth_version%3D1.0

没有 GET 或 POST 参数。从我在这里看到的一切似乎都正确地逃脱了。签名适用于 request_token 步骤(对于 Twitter,适用于任何请求)。我已经确认我的服务器时钟在他们的一秒内。我错过了一些明显的东西吗?您将如何诊断?

4

1 回答 1

2

我会回答我自己的问题。

不同的 oauth 服务提供者实现之间存在一些差异:

推特

  • 在 request_token 步骤上期望 oauth_callback
  • 在 access_token 响应之前不返回 oauth_token_secret
  • 因此,在签署 access_token 请求时有一个空的 oauth_token_secret

Flickr 和 Tumblr

  • 在认证(即授权)步骤中期望 oauth_callback
  • 在 request_token 步骤上返回 oauth_token_secret(并希望您记住它并使用它来签署 access_token 请求)

Youtube(和其他 Google OAuth 服务提供商):

  • 在 request_token 步骤中期望 Google 专有的“范围”
  • 在认证(即 OAuthAuthorizeToken)步骤中期望 oauth_callback
  • 似乎不喜欢在 access_token 步骤中在 Authorization 标头中传递的 oauth_token(由于在基本字符串中需要双重编码,因此以“令牌无效”响应)。而是将其传递到帖子正文或查询字符串中。
于 2011-12-05T23:03:12.417 回答