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

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

我计划改进抄写员添加此功能(这并不难)...但是有人已经这样做了吗?

4

2 回答 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();

希望有帮助!

于 2012-01-08T20:22:40.093 回答
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();
于 2014-02-24T12:31:20.510 回答