LoginSignup
12
9

More than 5 years have passed since last update.

Basic認証をJavaで実装する

Last updated at Posted at 2018-02-05

めちゃくちゃ車輪の再発明だけど、
車輪の規格が合わなくて自作しないといけないときもあるんだ…。

ログイン画面作るのがメンドクサイときにも使えるかもしれない。

マイクロフレームワークSpark Frameworkでの実装例です

まずはBasic認証についてのお勉強

basic認証の挙動 - Qiita

ふむふむ…。
まず、httpサーバがステータス401
WWW-Authenticate: Basic realm=\"Secret Zone\"\r\nとかいうヘッダーを返しておけばよさようだ

そしたら、ブラウザ側で認証情報入力したら
Authorization: Basic <'ID:PASS'のBase64形式>っていうヘッダーがクライアントから来るから
それをデコードして一致してれば認証OKで、NGならまた401を返せばいいみたいだ

さっそく実装

使えそうなスニペットが無いか、公式ドキュメントを見てみよう。

Documentation - Spark Framework: An expressive web framework for Kotlin and Java

各リクエストの処理の前に走るフィルターで認証処理をするのが良さそうだ。

実装してみた例

before((request, response) -> {
  String reqAuth = "" + request.headers("Authorization");
  String basicAuth =
      Base64.getEncoder().encodeToString("user1234:password1234".getBytes(StandardCharsets.UTF_8));
  if (!reqAuth.replaceAll("Basic\\s", "").equals(basicAuth)) {
    System.out.println("Basic Authorization is failed!");
    response.header("WWW-Authenticate", "Basic realm=\"Secret Zone\"\r\n");
    halt(401, "You are not welcome here");
  }
});

Java8じゃないと標準のBase64ライブラリが使えないんで、
Java7の人は、↓の好きなほうを使いましょう
BaseEncoding (Guava: Google Core Libraries for Java 16.0 API)
Base64 (Apache Commons Codec 1.11 API)

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9