日々常々

ふつうのプログラマがあたりまえにしたいこと。

JAX-RS ClientでBasic認証してみる

背景

REST APIにアクセスする必要がある。BASIC認証がかかっている。JAX-RSのClientAPIを使ってアクセスしたい。

とりあえずHTTPヘッダに直接AuthorizationBase64エンコードしたのを突っ込んでやってたんだけど、なんかイマイチな感じがした。で、うらがみさんに「どうしたら良いんだろ?」って言ったら「あー」とか言いながら書いてくれました。ちなみに楽しそうに書いてたのはクライアントの方じゃなくてContainerRequestFilterの方です。

で、その流れでこの辺のドキュメント読んだりしたのでメモメモ。

やりかた

  • Jersey - 2.17
  • RESTEasy - 3.0.9.Final

WebTargetBasic認証をやってくれる子を登録する。

// Jersey
ClientBuilder.newClient()
        .target(TARGET_URI)
        .register(HttpAuthenticationFeature.basic("user", "pass"))
        .request()
        .get();

// RESTEasy
ClientBuilder.newClient()
        .target(TARGET_URI)
        .register(new BasicAuthentication("user", "pass"))
        .request()
        .get();

Jerseyでは HttpAuthenticationFeature と言う javax.ws.rs.core.Feature の実装クラスを使う。RESTEasyだと BasicAuthentication と言う javax.ws.rs.client.ClientRequestFilter の実装クラスを使う。

どっちも使い方は同じようなものだけど、各実装ライブラリに依存したクラスが出てきちゃうので、実装ライブラリの切り替えはし辛くなりそうな感じです。実装ライブラリの切り替えってそんな頻繁にあるものじゃないだろうけど。

Basic認証はヘッダにBase64エンコードしたユーザ名/パスワードを付ければなんとかなりますので、力技で書くことも可能ではあります。 だからと言って、自分で書くべきとは思いません。あるもの使わないのは勿体ないですし。

ところで言えJavaEEアプリケーションサーバーを使うときは javax:javaee-api とかをprovidedで依存させるような気がする。それだとこれらの実装クラスって使えないね……どうしよう。ある程度実装依存のを使った方が良いんだろうか。むーん。