3

スクライブrefresh_tokenがアクセストークンを抽出しないことがわかりました。

OAuth1.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

あなたの言うことは本当です。refreshScribeは、アクセストークンのメソッドを提供しません。Scribeは、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();

お役に立てば幸いです。

于 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 に答える