Scribe不支持在OAuth 2.0中使用refresh_token,对吗?

3
我发现 scribe 在访问令牌中不能提取 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。Scribe简单地忽略了它:

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);
}

这会导致一个问题。访问令牌可能会在将来过期。我必须通过保存的刷新令牌在每次登录进程中刷新访问令牌,但没有直接获取它的方法。
我计划改进scribe并添加此功能(不难)...但是否已经有人完成了这个?
2个回答

6

你说的没错。Scribe没有为访问令牌提供refresh方法。Scribe旨在使OAuth签名变得简单。 OAuth2.0相当简单,如果每个人都使用OAuth2,可能就没有Scribe的用处了(它在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();

希望这能帮上忙!

您还需要传递client_id和client_secret...请注意,如果Scribe没有执行OAuth2,我将使用oauth-signpost :-) - ejain
1
这个标志牌?https://github.com/mttkay/signpost 最后一次提交是一年多以前,它仍然无法与LinkedIn API配合使用。祝你好运。 - Pablo Fernandez

2
您可以使用以下代码来实现这一点(以Google提供程序为例)。
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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接