Retrofit2でDigest認証の鯖とやりとりする
Motivation
対Digest認証を持つサーバーとお話することがあったので。 AndroidだとApacheのHttpClientがお亡くなりになったことで情報が色々入り交じってる。 今時だとOkHttp+Retrofit(2系からはokHttpを持ってる)を利用することが多そうなので、この環境で考える。
Digest認証とは
Digest認証は、一度サーバーにアクセスした際にランダムな文字列(nonce)や認証方式(Digest)、認証領域 (realm) などを
受け取り、これらとクライアントの持つUser,Passwordから生成したデータをもって認証を行う方式である。
Digest認証についての実装については、以下が非常にわかりやすく纏まっていた。
http://x68000.q-e-d.net/~68user/net/http-auth-2.html
okhttp3でのDigest認証
OkHttp3においてDigest認証を行う場合は、Authenticatorの拡張が必要となる。
拡張したAuthenticator上で、上記リンク内の処理を順次実行すると認証を行うことが出来る。
ここでは、実装済みの下記ライブラリを利用する。
https://github.com/rburgst/okhttp-digest
OkHttpClientをRetrofit2に設定する
以下の様にOkHttpClientの生成時にBuilder.authenticator()経由でAuthenticatorを設定する。 設定済みのOkHttpClientはRetrofit.Builder.client()にてRetrofitに設定する。
ここで生成したRetrofit経由で生成したCallをenqueueすれば、期待通りにDigest認証を通せる。
ついでにRxAndroidでも
RxAndroidを用いた場合は、CallではなくObservableを利用していると思うので、
以下のようにLogin後の処理などをチェーンで結ぶことが出来て良い感じに書ける。