4

我正在使用 grails oauth 插件。这为我提供了雅虎的access_token成功。但问题是——这个令牌(来自雅虎)的有效期仅为 1 小时。之后我们需要刷新它。并且通过他们的文档,他们似乎有刷新它的过程(以防令牌过期)。而这个调用绕过了第三条腿(用户的手动接受过程)。这是非常好的!

现在,如果我尝试使用方法oauthService.fetchAccessToken——我想这是命中get_access_tokenurl 的方法(在提供者方面)。但我得到了例外:

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(Unknown Source) at org.grails.plugins.oauth.OauthService.fetchAccessToken(OauthService.groovy:286) at org.grails.plugins.oauth.OauthService$fetchAccessToken.call(Unknown Source)


我已经进一步调试了插件和路标代码。而且我认为我们应该研究一下路标(现在),以后可以轻松修改插件。

供您参考,我正在使用带有 commonshttp4 客户端的路标(jar - 1.2.1.1)

这是用于刷新 accessToken 的 Yahoo 文档页面的链接。 http://developer.yahoo.com/oauth/guide/oauth-refreshaccesstoken.html

雅虎oauth_session_handle在请求中需要参数,该参数由雅虎使用 accessToken 发送。路标确实提供了一种获取此信息的方法—— provider.getResponseParameters()

现在接下来是,我使用以下方式将这些参数放回 refreshToken 请求 - consumer.setAdditionalParameters(httpParams)

但它不起作用!以下是堆栈跟踪的一部分。当我尝试获取 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)

期待很快收到一些伟大/慷慨的人的消息:-)

谢谢, 萨利尔

4

1 回答 1

5

我找到了答案并想与其他人分享(可能会陷入类似情况)。

首先,如果您使用路标库进行 oauth,我建议您停止使用它。因为,自 2011 年 1 月以来,开发已停止。请阅读: http ://brainflush.wordpress.com/2011/01/27/stepping-back-from-signpost-development/

我为此使用了“scribe-java”。这是github上的链接。您可以使用 maven 或下载 jar 或直接 fork 代码。 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"
于 2011-09-28T05:58:08.963 回答