Обновите токен доступа Yahoo Oauth с помощью плагина grails-oauth на основе API-интерфейса sign-post

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

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

oauth.signpost.exception.OAuthNotAuthorizedException: Ошибка авторизации (сервер ответил кодом 401). Это может произойти, если ключ потребителя был неправильным или подписи не совпадали. в oauth.signpost.AbstractOAuthProvider.handleUnexpectedResponse(AbstractOAuthProvider.java:239) в oauth.signpost.AbstractOAuthProvider.retrieveToken(AbstractOAuthProvider.java:189) в oauth.signpost.AbstractOAuthProvider.retrieveAccessToken(AbstractOAuthProvider.java:99) в oauth.signpost.java:99 OAuthProvider$retrieveAccessToken.call(неизвестный источник) в org.grails.plugins.oauth.OauthService.fetchAccessToken(OauthService.groovy:286) в org.grails.plugins.oauth.OauthService$fetchAccessToken.call(неизвестный источник)


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

К вашему сведению, я использую указатель (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. Когда я пытаюсь получить RefredAccessToken

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

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

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


person Salil    schedule 14.09.2011    source источник


Ответы (1)


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

Прежде всего, если вы используете библиотеку указателей для 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"
person Salil    schedule 28.09.2011
comment
Спасибо! Это сэкономило мне много времени и головной боли! - person Craigo; 12.10.2012