背景
REST APIにアクセスする必要がある。BASIC認証がかかっている。JAX-RSのClientAPIを使ってアクセスしたい。
とりあえずHTTPヘッダに直接Authorization
とBase64エンコードしたのを突っ込んでやってたんだけど、なんかイマイチな感じがした。で、うらがみさんに「どうしたら良いんだろ?」って言ったら「あー」とか言いながら書いてくれました。ちなみに楽しそうに書いてたのはクライアントの方じゃなくてContainerRequestFilter
の方です。
で、その流れでこの辺のドキュメント読んだりしたのでメモメモ。
- Jersey - 5.9.1.Http Authentication Support
- RESTEasy - 39.6. Obtaining an access token programmatically
やりかた
- Jersey - 2.17
- RESTEasy - 3.0.9.Final
WebTarget
にBasic認証をやってくれる子を登録する。
// 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で依存させるような気がする。それだとこれらの実装クラスって使えないね……どうしよう。ある程度実装依存のを使った方が良いんだろうか。むーん。