Обновите Yahoo Oauth Access Token с помощью плагина grails-oauth, основанного на API-интерфейсе sign-post. - PullRequest
4 голосов
/ 14 сентября 2011

Я использую плагин Grails oauth.Который успешно предоставляет мне access_token Yahoo.Но проблема в том, что этот токен (от Yahoo) имеет срок действия только 1 час.И после этого нам нужно его обновить.И, просматривая их документацию, кажется, что у них есть процесс, чтобы обновить его (в случае истечения срока действия токена).И этот вызов обходит третий этап (процесс принятия вручную пользователем).это очень хорошо!

Теперь, если я пытаюсь использовать метод oauthService.fetchAccessToken - я предполагаю, что это метод, который достигает get_access_token url (на стороне провайдера).Но я получаю исключение:

oauth.signpost.exception.OAuthNotAuthorizedException: авторизация не удалась (сервер ответил 401).Это может произойти, если ключ потребителя был неверен или подписи не совпадали.по адресу oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse (AbstractOAuthProvider.java:239) по адресу oauth.signpost.AbstractOAuthProvider.retrieveToken (AbstractOAuthProvider.java:189) по адресу oauth.signpost.Aject.Aject.Aove.Aide.AutOAuthProvider $ retrieveAccessToken.call (Неизвестный источник) по адресу org.grails.plugins.oauth.OauthService.fetchAccessToken (OauthService.groovy: 286) по адресу org.grails.plugins.oauth.OauthService $ fetchAccessTour * Unknown) Unknown.1010 *


Я отлажен в плагине и коде указателя.И я думаю, что мы должны посмотреть на signpost (пока), плагин можно легко изменить позже.

Для вашей информации, я использую signpost (jar - 1.2.1.1) с клиентом commonshttp4

вот ссылка на страницу документации Yahoo для обновления accessToken.http://developer.yahoo.com/oauth/guide/oauth-refreshaccesstoken.html

Yahoo требуется параметр oauth_session_handle в запросе, отправленном Yahoo с помощью accessToken.Signpost действительно предоставляет способ получить это - provider.getResponseParameters().

Теперь, следующий, я использую следующий способ вернуть эти параметры обратно в запрос refreshToken - consumer.setAdditionalParameters (httpParams)

Но это не работает!Следующее является частью stacktrace.Когда я пытаюсь получить refreshedAccessToken

oauth.signpost.exception.OAuthNotAuthorizedException: авторизация не удалась (сервер ответил 401).Это может произойти, если ключ потребителя был неверен или подписи не совпадали.по адресу oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse (AbstractOAuthProvider.java:239) по адресу oauth.signpost.AbstractOAuthProvider.retrieveToken (AbstractOAuthProvider.java:189) по адресу oauth.signpost.AbstractOret*

с нетерпением жду ответа от какого-нибудь великого / щедрого парня (ей): -)

Спасибо, Салил

1 Ответ

5 голосов
/ 28 сентября 2011

Я нашел ответ и хочу поделиться им с другими (которые могут попасть в подобную ситуацию).

Прежде всего, если вы используете библиотеку указателей для oauth, я бы порекомендовал вам прекратить ее использовать.,Потому что разработка была остановлена ​​с января 2011 года. Прочитайте это: http://brainflush.wordpress.com/2011/01/27/stepping-back-from-signpost-development/

Я использовал для этого «scribe-java».вот ссылка на github.Вы можете использовать Maven или скачать JAR или просто разветвить код.https://github.com/fernandezpablo85/scribe-java/

Его очень просто использовать, даже URL-адреса (лучших) поставщиков услуг предварительно настроены.

Вот код, как обновить его с помощью библиотеки scribe-java.

Token accessToken = new Token('your-expired-token-key', 'your-expired-token-secret')
println ".......................... Expired Token ........................\n $accessToken"

OAuthRequest request = new OAuthRequest(Verb.GET, "https://api.login.yahoo.com/oauth/v2/get_token");
request.addOAuthParameter('oauth_session_handle', 'your-yahoo-session-handle') // you need to fetch it from the parameters when get your access token.
service.signRequest(accessToken, request);
Response response = request.send();
accessToken = YahooApi.class.newInstance().getAccessTokenExtractor().extract(response.getBody())

println ".......................... Refreshed Token ........................\n $accessToken"
...