我正在使用grails oauth插件。哪个成功地为我提供了雅虎的access_token
。但问题是 - 这个令牌(来自雅虎)的有效期仅为1小时。之后我们需要刷新它。通过他们的文档,似乎他们有刷新它的过程(如果令牌过期)。这个调用绕过了第三条腿(用户的手动接受过程)。那太好了!
现在,如果我尝试使用方法oauthService.fetchAccessToken
- 我想这是点击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) at oauth.signpost.OAuthProvider $ retrieveAccessToken.call(未知 来源)at org.grails.plugins.oauth.OauthService.fetchAccessToken(OauthService.groovy:286) 在 org.grails.plugins.oauth.OauthService $ fetchAccessToken.call(未知 源)
我已经进一步调试了插件和路标代码。我认为我们应该研究路标(现在),插件可以在以后轻松修改。
为了您的信息,我使用signpost(jar - 1.2.1.1)与commonshttp4客户端
这是用于刷新accessToken的Yahoo文档页面的链接。 http://developer.yahoo.com/oauth/guide/oauth-refreshaccesstoken.html
雅虎在请求中需要oauth_session_handle
参数,该参数由yahoo发送,带有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)
谢谢, 塞利勒
答案 0 :(得分: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"