2012-01-07 60 views
3

我发现scribe不会在访问令牌中提取refresh_tokenscribe不支持oauth 2.0中的refresh_token对吗?

要OAuth 1.0提取包含:

Preconditions.checkEmptyString(response, "Response body is incorrect. Can't extract a token from an empty string"); 
String token = extract(response, TOKEN_REGEX); 
String secret = extract(response, SECRET_REGEX); 
return new Token(token, secret, response); 

其中包含令牌密钥。

但是在OAuth2.0中,没有令牌密钥,而是代替refresh_token。抄写员根本忽略它:

Preconditions.checkEmptyString(response, "Cannot extract a token from a null or empty String"); 
Matcher matcher = accessTokenPattern.matcher(response); 
if(matcher.find()) 
{ 
    return new Token(matcher.group(1), "", response); 
} 
else 
{ 
    throw new OAuthException("Cannot extract an acces token. Response was: " + response); 
} 

这会导致问题。访问令牌将来可能会过期。我必须在每个登录页面中通过保存的刷新令牌来刷新访问令牌,但是无法直接获取它。

我打算改进抄写员添加此功能(这并不难)......但是有没有人已经这样做?

回答

6

你说的是真的。抄写员不会为您的访问令牌提供refresh方法。抄写员是为了使OAuth签名容易。 OAuth2.0非常简单,如果每个人都在使用OAuth2,那么抄写员就不会有任何目的(它会影响1.0a流量)。

无论如何,你可以轻松地做翻新步骤是这样的:

OAuthRequest request = new OAuthRequest(Verb.POST, "http://server.example.com/token"); 
request.addBodyParameter("grant_type", "refresh_token"); 
request.addBodyParameter("refresh_token", accessToken.getToken()); // were accessToken is the Token object you want to refresh. 

request.send(); 

希望帮助!

+0

您还需要通过CLIENT_ID和client_secret ......请注意,如果抄写没有做的OAuth2,我d只需使用oauth-signpost :-) – ejain 2013-04-05 20:23:16

+1

这个路标? https://github.com/mttkay/signpost最后一次提交来自一年多前,它仍然不能用于LinkedIn api。祝你好运。 – 2013-04-06 15:44:59

2

你可以做,用下面的代码(谷歌提供者为例)

OAuthRequest request = new OAuthRequest(Verb.POST,"https://accounts.google.com/o/oauth2/token"); 
    request.addBodyParameter("grant_type", "refresh_token"); 
    request.addBodyParameter("refresh_token", accessToken.getToken()); // were accessToken is the Token object you want to refresh. 
    request.addBodyParameter("client_id", your clientID); 
    request.addBodyParameter("client_secret", your clientSecret); 
    Response response = request.send();