tomcatで任意のディレクトリのみBasic認証を実施してみる

はじめに
---
MSALライブラリのサンプルコードを使って、Azure ADを使って、色々な認証を試してみました。が、、Single Sign Onで重要な要素である、ID連携とインフラがまだ残っております。既存Web ApplicationのSSOを検討するときに、独自IDとAzure ADとの連携を考慮する必要がありますので、独自IDを使った認証の検証環境を作っていきたいと思います。まずは、TomcatのBasic認証です。

SSOで考えなければならないこと。
(1).認証
(2).ID連携 ==> 今回のスコープ
(3).インフラ(ネットワーク&セキュリティ)

Basic認証とは?
---
IT用語辞典からの引用です。

http://e-words.jp/w/BASIC%E8%AA%8D%E8%A8%BC.html

>BASIC認証とは、Webコンテンツの送受信などに用いられるプロトコル（通信規約）HTTP（Hypertext Transfer Protocol）の利用者認証の方式の一つで、最も単純で基本的なもの。WebサーバがWebブラウザなどからアクセスの制限された領域への送信要求（HTTPリクエスト）を受信すると、エラーコード401（Authorization Required）を返信し、利用者のID（ユーザ名）とパスワードの送信を要求する。ブラウザは利用者に認証情報の入力を求め、これをWebサーバに送り、サーバ側に保存された情報と照合してアクセスを許諾あるいは拒否する。ブラウザから送信される認証情報は「ユーザ名:パスワード」という形式で「:」（コロン）で区切って並べ、これをBASE64でエンコーディングした文字列をHTTPヘッダのAuthorizationフィールドに記載する。

セキュリティ的にどうかと考えると、ログイン情報は平文となり、「Base64」という64種類の文字を用いて符号を付与した通信を使います。盗聴された場合、Authorizationフィールの値をデコードすれば、ユーザー名とパスワードがわかります。（下記は、今回の特定ディレクトリのBasic認証をキャプチャした結果となります。) また、Basic認証はファイルやディレクトリ単位のみの制御となりますので、複数のサーバーを使ったサイトでは、一貫したログインは、取り扱えないです。よって、簡易的な認証の仕組みとなります。

<img width="522" alt="base64.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/76c61fbe-a926-a088-9258-baefda905f27.png">


いざスタート
---
環境は下記となります。

|サービス|Version|
|---|---|
|Tomcat|9.0.30.0|
|Java|jdk1.8.0_172|

**No1.任意のディレクトリ作成**

◆(1).ディレクトリの追加
webapps配下にBasic認証を実施するディレクトリと、その配下にWEB-INFディレクトリを作成、HelloWorld を表示する為のJavaファイルを設定するclassesフォルダを作成する。

|目的|値|
|---|---|
|Baisc認証ディレクトリ| Servlet|

<img width="253" alt="1.Folder.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/39825d1d-eb61-5c74-e561-2429edd7a56c.png">

◆(2).web.xmlの作成
web.xmlファイルを作成致します。

C:\tomcat9\webapps\Servlet\WEB-INF\web.xml

|要素|値|備考|
|---|---|---| 
|servlet-name |basicauth|URLパターンにアクセスするとこのサーブレット名が呼び出される|
|servlet-class |Servlet|クラス名|
|url-pattern |/basicauth|URLパターン|

<img width="420" alt="4.Servlet.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/ab8818f1-05a3-f3d7-fa77-ff7f9f782c2d.png">

◆(3).サーブレットクラスの作成

HelloWorldを表示するJavaプログラムを作成致します。

C:\tomcat9\webapps\Servlet\WEB-INF\classes\Servlet.java


```
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class Servlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html><head></head><body>");
    out.println("<p>basicauth</p>");
    out.println("<p>Hello World</p>");
    out.println("</body></html>");
  }
}
```

◆(4).コンパイル

作成したJavaファイルのコンパイルを実施します。実施すると同じ名前で「.class」ファイルが作成されます。

<img width="661" alt="5.java.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/fb625a2e-43d3-f82d-69dc-5dbeb9544b17.png">

<img width="305" alt="3.class.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/a76563ed-c59e-1dd9-e3c9-e9c0beff8bbb.png">



**No2.Basic認証設定**

◆(1).tomcat-users.xml

Baisc認証用の設定を追加致します。

C:\tomcat9\conf\tomcat-users.xml

```
<role rolename="basic"/>
<user username="authuser" password="password1" roles="basic"/>
```

<img width="432" alt="5.tomcatusers.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/b884cacf-b772-e74c-c691-91551172849a.png">


◆(2).web.xml
web.xmlにBasic認証設定を追加致します。

C:\tomcat9\webapps\Servlet\WEB-INF\web.xml

```
 <security-constraint>
  <web-resource-collection>
   <web-resource-name>User Basic Auth</web-resource-name>
   <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
   <role-name>basic</role-name>
  </auth-constraint>
 </security-constraint>

 <login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>User Basic Auth</realm-name>
 </login-config>

 <security-role>
  <role-name>basic</role-name>
 </security-role>
```

<img width="408" alt="6.web.xml.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/a983b96e-9cf0-a1b5-d2b6-48f09f4583c4.png">

◆(3).tomcat再起動
最後にTomcatの再起動を実施致します。

**No3.Basic認証確認**

◆(1).http://localhost:8080/ にアクセス致します。Basic認証は無しとなります。

◆(2).http://localhost:8080/Servlet/basicauth にアクセスするとユーザー名・パスワードを求められますので、入力致します。

<img width="643" alt="7.login.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/a39ee55d-cd6e-cf89-49a6-25f64bdb54e9.png">

◆(3).ログイン完了

<img width="270" alt="8.complete.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/33421d66-bdf4-c045-74f7-a775e114ef84.png">

無事に、tomcatで任意のディレクトリのみBasic認証が完成致しました。

まとめ
---
Basic認証の環境は、出来上がりましたが、Microsoft identity platformとどのように組み合わせるかは、これからの確認となります。

最後に、私の記事が少しでもお役に立てれば、幸いでございます。