Это сводит меня с ума. Я реализую схему приглашения друзей на веб-сайте, и мне нужен доступ к списку контактов Yahoo пользователя. Для этого я использую OAuth и REST API Yahoo. Вот полное изложение последовательности событий:
У меня есть проект, созданный на сайте developer.yahoo.com, который настроен на доступ для чтения к контактам. Он находится в выдуманном домене, на который я указываю 127.0.0.1 в файле hosts (на случай, если локальный хост был причиной моих бед). По этой причине домен не проверен, хотя я понимаю, что это просто означает, что у меня меньше ограничений, а не больше.
Во-первых, на сервере я получаю токен запроса:
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. Я не думаю, что это делает что-то экстраординарное или несовместимое. Для подписи я включаю ключ/секрет потребителя и токен/секрет доступа. Я просмотрел базу сигнатур, которая хэшируется, и похоже, что она имеет ту же форму, что и примеры, видимые в документации Yahoo. Я предполагаю, что мне не хватает чего-то из параметров, которые не хэшируются. Есть ли способ выяснить, почему вызов является несанкционированным, или кто-нибудь знает пример, показывающий, какую именно форму должны принимать база подписи и заголовок авторизации?