[解決済み] Retrofitを使用して、すべての呼び出しを変更せずにOAuthトークンをリフレッシュする
質問内容
AndroidアプリでRetrofitを使用し、OAuth2で保護されたサーバーと通信しています。RequestInterceptorを使用して、各コールにアクセストークンを含めることで、すべてうまくいっています。 しかし、アクセストークンが期限切れになり、トークンをリフレッシュする必要がある場合があります。トークンの有効期限が切れると、次の呼び出しはUnauthorized HTTPコードで返されるので、これは簡単に監視することができます。 各Retrofitの呼び出しを次のように修正すればいい。 失敗コールバックでエラーコードをチェックし、それがUnauthorizedであれば、OAuthトークンをリフレッシュし、Retrofitの呼び出しを繰り返す。 しかし、そのためにはすべての呼び出しを変更する必要があり、簡単に保守できる良い解決策ではありません。 すべてのRetrofitコールを修正することなく、これを行う方法はないでしょうか?
解決方法は?
を使用しないでください。
Interceptors
を使用して、認証を処理します。
現在のところ、認証を処理するための最適な方法は、新しい
Authenticator
のために特別に設計されたAPIです。
この目的
.
OkHttpは
を自動的に尋ねます。
その
Authenticator
が応答するときの認証情報用
401 Not Authorised
さいしょうゆうこうすうじ
を添えて。
public class TokenAuthenticator implements Authenticator {
@Override
public Request authenticate(Proxy proxy, Response response) throws IOException {
// Refresh your access_token using a synchronous api request
newAccessToken = service.refreshToken();
// Add new header to rejected request and retry it
return response.request().newBuilder()
.header(AUTHORIZATION, newAccessToken)
.build();
}
@Override
public Request authenticateProxy(Proxy proxy, Response response) throws IOException {
// Null indicates no attempt to authenticate.
return null;
}
を添付してください。
Authenticator
に対して
OkHttpClient
と同じように
Interceptors
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setAuthenticator(authAuthenticator);
を作成する際に、このクライアントを使用します。
Retrofit
RestAdapter
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(ENDPOINT)
.setClient(new OkClient(okHttpClient))
.build();
return restAdapter.create(API.class);
関連
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
Androidで発生した問題、解決策とヒント
-
Android開発で「Attempt to invoke virtual method 'XXX()' on null object reference」というヌルポインター例外に遭遇する。
-
ライブラリをモジュールとしてインポートする際にエラーが発生しました。Error:A problem occurred configuring project ':library'.
-
アンドロイドのエリプサイズを使用する
-
問題 ---- Android ---- ActivityManager: Error: アクティビティクラス{xx/xx.MainActivity}が存在しない
-
Android Get set image.setImageResource(R.drawable.xxx) リソース
-
[解決済み】OAuth2.メリットとユースケース - なぜ?
-
[解決済み】アクセストークンが失効するのはなぜですか?
-
[解決済み】OAuth 2は、Security Tokenを使用したリプレイ攻撃などからどのように保護するのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NetworkOnMainThreadException
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
Android のパッケージングに失敗し、Android リソースのリンクに失敗したことを示すプロンプトが表示される
-
ConstraintLayoutのいくつかのプロパティの概要(RelativeLayoutの強化版、LinearLayoutの比例プロパティを含む、階層ツールの削減)。
-
Android Bluetooth 開発の基本プロセス
-
SpinnerのOnItemSelectedListenerのonItemSelectedメソッドの4つのパラメーターの意味
-
Androidカスタムドロップダウンリストボックスコントロール
-
超シンプルなアンドロイドのタイムディレイ機能
-
アンドロイドスタジオ学習入門
-
android studioが新しいプロジェクトを作成しますが、プロジェクトの同期に成功するまでデザインエディタが使用できません。