获得OAuth访问令牌(不是特定于语言的)——Flickr和Tumblr也有同样的问题,但Twitter没有


Getting an OAuth access token (not language specific) - same issue for Flickr and Tumblr, but not Twitter

我犯了一个巨大的错误,用PHP编写我自己的OAuth库和包装器类。对于Twitter的OAuth实现,一切都工作得很好,但是我在为Tumblr和Flickr签署access_token步骤时失败了。

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

基本字符串(为了清晰起见,不完整):

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,适用于任何请求)。我已经确认我的服务器时钟和他们的相差不到一秒。我错过了什么明显的东西吗?你怎么诊断呢?

我来回答我自己的问题。

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

Twitter

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

Flickr,Tumblr

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

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

  • 期望在request_token步骤上使用google专有的"作用域"
  • 期望oauth_callback对认证(即OAuthAuthorizeToken)步骤
  • 似乎不像oauth_token在access_token步骤的授权头中传递(响应"令牌无效",由于在基本字符串中需要双重编码)。在文章正文或查询字符串中传递。