2011-09-14 104 views
4

我正在使用grails oauth插件。這是爲我成功提供了雅虎的access_token。但問題是 - 這個令牌(來自雅虎)只有1小時的有效期。之後,我們需要刷新它。並通過他們的文檔,似乎他們有過程來刷新它(萬一令牌過期)。這個呼叫繞過第三條腿(用戶手冊驗收過程)。這是非常好的!使用grails-oauth插件刷新Yahoo Oauth訪問令牌基於簽名後api

現在,如果我正在嘗試使用方法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.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客戶

這裏是雅虎文檔頁面的刷新了的accessToken的鏈接。 http://developer.yahoo.com/oauth/guide/oauth-refreshaccesstoken.html

雅虎需要oauth_session_handle參數在雅虎通過accessToken發送的請求中。路標確實提供了一種獲取此的方法 - 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.AbstractOAuthProvider.retrieveAccessToken(AbstractOAuthProvider。Java的:99)

期待着一些偉大的/慷慨的傢伙(S):-)

感謝很快聽到, 薩里爾

回答

5

我已經找到了答案,並希望分享他人(誰可能陷入類似的情況)。首先,如果你使用oauth的路標庫,我會建議你停止使用它。因爲,開發自2011年1月以來一直停止。閱讀: 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" 
+1

謝謝!這節省了我很多時間和頭痛! – Craigo