【Microsoft ID プラットフォーム】(Azure AD) Java Web アプリ (eclipse)-設定編-

はじめに（背景)
-----
下記検証の続きとなります。

SPA (Node.js)
https://qiita.com/Design_Tshirt7/items/553958e3724cc3718aa9
ASP.NET
https://qiita.com/Design_Tshirt7/items/c282d645c2117be12d4e
ASP.NET Core
https://qiita.com/Design_Tshirt7/items/ed8d45a0dff76b741c03
Java Web アプリ (WARfile)
https://qiita.com/Design_Tshirt7/items/df8dd7799bfdc32c9078

背景は、上記と同じとなりますが、初めてご訪問頂いた人もいると思いますので、記載させて頂きます。

Office365を導入して、数年が経ちました。
皆様が慣れてきて、そろそろ、Office365とのシングルサインをすれば、便利になるんじゃない！！との声が出来てきました。そして、上司から、"Single Sign On よろしく！"との恐ろしい声がかかりました。

確かにIDaaSとしてのAzure ADは既に稼働しているので、後は、連携するアプリケーションの準備が出来れば可能ですが、、、このオンプレWebアプリケーションとIDaaSとのSSOは敷居が高い。

なぜなら、アプリケーション側でSAML/OpenIDConnect/OAuthとおしゃべりができないので、改修が必須となる。そこで、Microsoft ID プラットフォームを使えば、ライブラリが提供されているので、これをうまく活用すれば、SSOの敷居が少しでも低くるなると考え、検証を開始致しました。

Microsoft ID プラットフォーム
-----
『Microsoft ID プラットフォーム (旧称: 開発者向け Azure Active Directory)』
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/

Microsoft ID プラットフォームは、Azure Active Directory (Azure AD) 開発者プラットフォームの進化版です。 これにより、すべての Microsoft ID にサインインして、Microsoft API (Microsoft Graph) や開発者が構築した API を呼び出すためのトークンを取得するアプリケーションを開発者が構築できます。 これはフル機能を備えたプラットフォームであり、OAuth 2.0 および OpenID Connect 標準に準拠した認証サービス、オープンソース ライブラリ、アプリケーションの登録および構成、充実した概念とリファレンスのドキュメント、クイック スタート サンプル、コード サンプル、チュートリアル、攻略ガイドによって構成されています。

ふむふむ。確かにサンプルコードがあるので、できそうかも。。。

いざトライ！！
--------
1.参照ページ
『Quickstart: Add sign-in with Microsoft to a Java web app』
https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-java-webapp

*日本語ページにするとstep3の4が省略されているので注意です。

2.登場人物
1.Identity Provider (Azure AD)
* オンマイクロソフトアカウントを使います。
2.Relying Party (Java)
(事前の準備をお願い致します。インストール方法は割愛させて頂きます)
- Java Development Kit (JDK) 8 以降
- Maven
- Spring boot
- eclipse

3.手順
◆手順1:アプリケーションの登録
1.Azure portal(https://portal.azure.com) にサインインします。
2.[ホーム]-> [Azure AD Active Directory] -> [アプリの登録]へ進む
<img width="200" alt="1.appregistration.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/c833bdb6-b907-a975-3f3d-fd7b71852208.png">

3.[新規登録] をクリックします。
<img width="400" alt="2.newregistration.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/eb898772-c631-3044-a4b1-4e9ff6b6de4f.png">

4.アプリケーション登録で下記項目を選択して、[登録]をクリック。
(1).名前欄：任意のアプリケーション名を入力
(2).サポートされているアカントの種類：この組織ディレクトリのみに含まれるアカウント
(3).リダイレクトURL：空白　=> (後ほど、入力されます。)
<img width="400" alt="1.reg.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/06544475-3f59-9f70-831a-161a309f34a4.png">

5.登録したアプリケーションが表示されますので、[クイックスタート]をクリック。
<img width="400" alt="2.quick.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/75d99dea-8cf3-e611-2d96-77cabd69c68a.png">

6.クイックスタートガイドの[Java]をクリック。
<img width="400" alt="3.java.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/21ad8801-4b79-26ae-b764-fab1df600746.png">

7.[これらの変更を行います]をクリック。
<img width="400" alt="4.change.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/ecee7b31-13f9-fc40-9e90-460831f14058.png">

8.下記構成内容が表示されますので、[更新する]をクリック。
(1).リダイレクト URI : 
http://localhost:8080/msal4jsample/secure/aad
http://localhost:8080/msal4jsample/graph/me
(2).クライアントシークレット
* 認可コードフローとなりますので、アクセストーンとIDトークンのチェックは無しとなっております。
<img width="400" alt="5.update.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/b2a214b3-ed1b-d9ec-8d31-1af48f5c33be.png">

9.クライアントシークレットが表示されますので、コピーをして、[完了]をクリック。
* クライアントシークレットは以降の手順で必要となりますので、必ずコピーをお願い致します。
<img width="400" alt="6.complete.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/8e84a999-0626-e266-3383-c6aded3e5349.png">

10.下記の[認証]画面から応答URLの内容が反映されている事を確認。
<img width="400" alt="7authn.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/fa5db3c7-a7bf-f106-f5ce-6e9cc166afc2.png">

◆手順2:プロジェクトのダウンロード
1.warを作成する為のプロジェクトファイルをダウンロードします。

プロジェクトファイル：ms-identity-java-webapp-master.zip

<img width="154" alt="1.download.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/87bc463a-218e-5c9d-0c66-474c1bce8799.png">

◆手順3:コード サンプルの構成
1.ZIP ファイルをローカル フォルダーに展開します。
<img width="322" alt="1.folder.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/494a1e9e-2b14-ad34-ec61-12f80b314219.png">

2.src\main\resources\のapplication.propertiesファイルを編集致します。
<img width="400" alt="2.application.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/376948d5-801b-2def-37e4-be41b7928922.png">

|name|value
|---|---
|aad.clientId (クライアントID)|69b99f5e-673d-44b6-b777-64ac67f49bbc|
|aad.authority (テナントID)|a94216cd-7c42-4b24-8ba0-ce5c210951bd|
|aad.secretKey(クライアントシークレット)|B_wP8cT8g?z=4RFGe3TvKe[M@fAJvhS8|

<img width="440" alt="3.application.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/7c5f96c2-566d-1574-47c0-beafac80f435.png">

3.Self-signed Certificateの作成とapplication.propertiesファイルの編集
3-1.Keyの作成を実施致します。
<img width="720" alt="4.ssl.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/f74c1799-9817-6f8f-551c-5b0c4fd5a2e4.png">

3-2.作成したkeyを"resource"フォルダに移動致します。
<img width="400" alt="5.keyfile.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/5e338b67-b367-143e-abcb-aa15ff837fc5.png">
<img width="450" alt="6.resoruce.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/b05a2c3f-83de-08f7-744b-32a46516d30a.png">

3-3.application.propertiesファイルの編集を行います。
<img width="400" alt="7.application2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/3229f387-fe85-10ad-9846-11eae0249b68.png">

◆手順4:Java, Maven, spring boot, eclipseのダウンロード&設定
*手順は割愛させていただきます。
*私が検証で使った各バージョンは、下記となります。

```
C:\>java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)
```

```
C:\>mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: C:\apache-maven-3.6.3\bin\..
Java version: 1.8.0_172, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_172\jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
```
*eclipse version
<img width="226" alt="EclipseVersion.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/0056b107-8fc6-b6fd-0c2d-ed771e36045c.png">
*spring boot version
<img width="243" alt="springbootversion.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/3fd1e466-928d-6c99-5b6c-2cc41e124ab4.png">

◆手順5:コード サンプルの実行
1.[mvn eclise:eclipse]を使ってEclipseプロジェクトへの変換を実施致します。
<img width="791" alt="1.mvncommand.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/25cb447f-6a29-258c-0b99-ed03d95c3ad8.png">

2.Eclipseプロジェクトへのインポート。
2-1.[ファイル]-[インポート]をクリック。
<img width="267" alt="2.import.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/627ace1e-9787-beba-a0de-245b7ebfc4ca.png">

2-2.[既存Mavenプロジェクト]を選択して、[次へ]をクリック。
<img width="259" alt="3.maven.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/4322c84f-dd3a-7d9f-537e-dd3141f7ee3a.png">

2-3.ルートディレクトにプロジェクトファイルを展開したフォルダを選択するとプロジェクトにpom.xmlが自動的に表示されますので、[完了]をクリック。
<img width="425" alt="4.mavnproject.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/0d7faf1d-688c-e15f-1255-4ecdff47a987.png">

2-4.インポートに時間がかかります。
右下に下記進捗が表示されます。
Mavenプロジェクトのインポート -> Mavenプロジェクトのの更新 -> ワークスペースのビルド -> msal-web-sampleの検証->インデックスの更新

2-5.パッケージ・エクスプローラーに[msal-web-sample]が追加されます。
<img width="182" alt="5.eclipse.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/a7e73fff-6a8e-f55d-6de8-bc0be1ff9407.png">
*事前にspring bootをインストールしてありますので、msal-web-sampleの横に[boot]が表示されます。

◆手順6: サインイン
*事前情報
Fiddlerログを基にトークンの取得情報を途中まで書いたのですが、長くなってしまったので、別記事でアップロードさせていただきます。

*事前準備
(1).Fiddlerでパケットキャプチャの準備。
(2).ダウンロードしたコアプロジェクトサンプルの仕組みをきちんと確認。
<img width="500" alt="Flow.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/6ea8e595-570b-1bae-345d-4c50282e8d39.png">

1.spring bootの起動
1-1.プロジェクト[msal-web-sample]を右クリック -> [デバッグ] -> [Javaアプリケーション]をクリック。
<img width="500" alt="1.startJavaApp.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/182f66d8-6b8e-7314-f3db-5fb1c6d34572.png">

1-2.MsalWebSampleApplicaitonを選択して、[OK]をクリック。
<img width="285" alt="2.msalwebsample.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/59444634-450f-4fda-6261-ee3ebe5e174c.png">

1-3.コンソール上にspring bootのログが表示されます。
<img width="500" alt="3.console.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/7bdafe85-4e87-23ca-c659-75f6dd40cc25.png">

2.認可コードの取得（認可エンドポイント)
2-1.https://localhost:8080にアクセスして、[Login]をクリック。
<img width="400" alt="4.loginscreen.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/32694ced-400d-8054-b675-081ff67c7565.png">

2-2.資格情報(ID/パスワード)の入力。
2-3.要求されているアクセス許可を承諾。
<img width="316" alt="5.consent.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/2e287f7d-98f6-f8b9-cbab-9d38db171170.png">

2-4.ログインが完了して、アカント情報が表示されます。
<img width="573" alt="6.sucesslogin.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/6728a376-6d2e-2c26-53ef-8d309ba62477.png">

3.User Infoエンドポイントへのアクセス
3-1.[Show User Info]をクリック。
<img width="573" alt="7.userinfo1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/0370fa43-23fa-e431-7579-1b2baa79e328.png">

3-2.要求されているアクセス許可を承諾。
<img width="314" alt="8.consent2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/fc098c15-ca1f-b995-cbba-66d2df262805.png">

3-3.現在ログインしているユーザーの情報が表示されます。
<img width="645" alt="9.userinfo2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/bbdee11e-87f8-c3f6-d7de-834efe215dd1.png">

3-4.コンソールログは、下記となります。
<img width="582" alt="10.springboot.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579284/0f8d5d05-3f32-bd35-9a15-8c2b7a459ae4.png">


無事ログイン完了!!

まとめ
-----------
トークンの取得情報は別記事でアップロードさせていただきます。
次回は、pythonの検証を予定しております。

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