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