这让我大吃一惊。我正在网站上实施朋友邀请计划,需要访问用户的雅虎联系人列表。为此,我使用 OAuth 和 yahoo REST api。以下是事件序列的完整概要:
我在developers.yahoo.com 上设置了一个项目,该项目配置为对联系人具有读取权限。它位于一个虚构的域上,我在我的主机文件中指向 127.0.0.1(很有可能是 localhost 导致了我的麻烦)。出于这个原因,虽然我的理解是,这只是意味着我有更少的限制,而不是更多的限制,但没有验证域。
首先,在服务器上我得到一个请求令牌:
https://api.login.yahoo.com/oauth/v2/get_request_token
?oauth_callback=http%3A%2F%2Fdev.mysite.com%2Fcallback.aspx
&oauth_consumer_key=MYCONSUMERKEY--
&oauth_nonce=xmaf8ol87uxwkxij
&oauth_signature=WyWWIsjN1ANeiRpZxa73XBqZ2tQ%3D
&oauth_signature_method=HMAC-SHA1
&oauth_timestamp=1328796736
&oauth_version=1.0
返回(格式化以模糊尝试清晰):
oauth_token=hxcsqgj
&oauth_token_secret=18d01302348049830942830942630be6bee5
&oauth_expires_in=3600
&xoauth_request_auth_url
=https%3A%2F%2Fapi.login.yahoo.com%2Foauth%2Fv2%2Frequest_auth
%3Foauth_token%3Dhxcsqgj
&oauth_callback_confirmed=true"
然后我向用户弹出 xoauth_request_auth_url 页面,并在我的回调页面中接收验证码。然后我将其发送回我的服务器,以便我可以将其交换为访问令牌:
https://api.login.yahoo.com/oauth/v2/get_token
?oauth_consumer_key=MYCONSUMERKEY--
&oauth_nonce=yxhd1nymwd03x189
&oauth_signature=c%2F6GTcybGJSQi4TOpvueLUO%2Fgrs%3D
&oauth_signature_method=HMAC-SHA1
&oauth_timestamp=1328796878
&oauth_token=hxcqgjs
&oauth_verifier=b8ngvp <- verifier given via callback
&oauth_version=1.0
这似乎有效,我得到了一个访问令牌:
oauth_token=MYVERYLONGACCESSTOKEN--
&oauth_token_secret=MYOATHTOKENSECRET
&oauth_expires_in=3600
&oauth_session_handle=ADuXM093mTB4bgJPKby2lWeKvzrabvCrmjuAfrmA6mh5lEZUIin6
&oauth_authorization_expires_in=818686769
&xoauth_yahoo_guid=MYYAHOOGUID
然后我立即尝试使用访问令牌和 GUID 获取联系人列表:
http://social.yahooapis.com/v1/user/MYYAHOOGUID/contacts
(HTTP Header added and formatted with line breaks for clarity...)
Authorization: OAuth
realm="yahooapis.com",
oauth_consumer_key="MYCONSUMERKEY--",
oauth_nonce="nzffzj5v82mgf4mx",
oauth_signature="moVJywesuGaPN5YHYKqra4T2ips%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1328796907",
oauth_token="MYVERYLONGACCESSTOKEN--",
oauth_version="1.0"
从这个电话我得到一个 401 Unauthorized,但似乎不可能找出原因。为了签署这些电话,我在 github 上使用了这个 oath lib。我不认为它在做任何非凡或不兼容的事情。对于签名,我包括消费者密钥/秘密和访问令牌/秘密。我查看了正在散列的签名库,它看起来与雅虎文档中可见的示例形式相同。我猜我在参数中遗漏了一些没有被散列的东西。有没有办法找出为什么调用是未经授权的,或者有没有人知道一个例子,说明签名库和授权标头必须采用什么形式?