techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

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に設定する。

gist.github.com

ここで生成したRetrofit経由で生成したCallをenqueueすれば、期待通りにDigest認証を通せる。

ついでにRxAndroidでも

RxAndroidを用いた場合は、CallではなくObservableを利用していると思うので、
以下のようにLogin後の処理などをチェーンで結ぶことが出来て良い感じに書ける。

gist.github.com