LoginSignup
3
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-16

はじめに(背景)

下記検証の続きとなります。

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

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

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

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

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

Microsoft ID プラットフォーム

『Microsoft ID プラットフォーム (旧称: 開発者向け Azure Active Directory)』

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

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

注意点

いつもなら、いざトライなのですが、、始める前に4つ程、注意点がございます。

(1).MSからクイックスタートで案内されているURLでは情報が足りなさすぎるので、下記ページで進めさせて頂きます。

『A Java Web application that signs in users with the Microsoft identity platform and calls Microsoft Graph』
https://docs.microsoft.com/en-us/samples/azure-samples/ms-identity-java-webapp/ms-identity-java-webapp/

(2).クイックスタートの手順では、応答URLがhttp://との案内ですが、HTTPでは、動作しません。応答URLをhttpsとして進めさせて頂きます。理由は、後ほど、解説致します。

Notice.PNG

(3).コードサンプルの実行では、WAR fileを使って検証致します。
* IDE (Eclipse)は別記事で、アップロードさせていただきます。

Step 5: Run the application
Run it directly from your IDE by using the embedded spring boot server or package it to a WAR file using maven and deploy it a J2EE container solution such as Apache Tomcat.

(4).他の検証手順と同じ手順にしたいと思いますので、参照ページと手順が前後致します。最終的には、参照ページと同じ結果となりますので、ご安心を!!

いざトライ!!

1.参照ページ
『A Java Web application that signs in users with the Microsoft identity platform and calls Microsoft Graph』
https://docs.microsoft.com/en-us/samples/azure-samples/ms-identity-java-webapp/ms-identity-java-webapp/

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

3.手順
◆手順1:アプリケーションの登録

1.Azure portal(https://portal.azure.com) にサインインします。

2.[ホーム]-> [Azure AD Active Directory] -> [アプリの登録]へ進む。
1.appregi.PNG

3.[新規登録] をクリックします。
2.appnew.PNG

4.アプリケーション登録で下記項目を選択して、[登録]をクリック。
(1).名前欄:任意のアプリケーション名を入力
(2).サポートされているアカントの種類:この組織ディレクトリのみに含まれるアカウント
(3).リダイレクトURL:空白 => (後ほど、入力されます。)
1.reg.PNG

5.登録したアプリケーションが表示されますので、[クイックスタート]をクリック。
2.quick.PNG

6.クイックスタートガイドの[Java]をクリック。
3.java.png

7.[これらの変更を行います]をクリック。
3.change.PNG

8.下記構成内容が表示されますので、[更新する]をクリック。
(1).リダイレクト URI :
http://localhost:8080/msal4jsample/secure/aad
http://localhost:8080/msal4jsample/graph/me
(2).クライアントシークレット
* 認可コードフローとなりますので、アクセストーンとIDトークンのチェックは無しとなっております。
4.update.PNG

9.クライアントシークレットが表示されますので、コピーをして、[完了]をクリック。
* クライアントシークレットは以降の手順で必要となりますので、必ずコピーをお願い致します。
5.secret.PNG

10.下記の[認証]画面から応答URLをhttpsに変更にして、[保存]をクリック。
*私の環境では、8080が他サービスと競合しておりますので、8443にポート番号も変えております。
[変更前]
6.authn.PNG
[変更後]
7.changeHTTPs.PNG

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

プロジェクトファイル:ms-identity-java-webapp-master.zip
1.download.PNG

◆手順3:コード サンプルの構成
1.ZIP ファイルをローカル フォルダーに展開します。
1.folder.PNG

2.src\main\resources\のapplication.propertiesファイルを編集致します。
2.appchange.PNG

name value
aad.clientId (クライアントID) 23bc5499-964d-40a9-bde1-3a9a540c49f1
aad.authority (テナントID) a94216cd-7c42-4b24-8ba0-ce5c210951bd
aad.secretKey (クライアントシークレット) J5jBkhbd]04pYoZ4pJEWvnWyp_WTS/M/
server.port 8443

3.resources.PNG

*server.portは応答URLで登録したポート番号に合わせてください。
*参照ページURLの説明はhttpとなっておりますが、ダウンロードしたファイルは、httpsになっております。

◆手順4:Java, Maven, Tomcatのダウンロード&設定
検証で使った各バージョンは、下記となります。

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"
C:\tomcat9\bin>version.bat
Using CATALINA_BASE:   "C:\tomcat9"
Using CATALINA_HOME:   "C:\tomcat9"
Using CATALINA_TMPDIR: "C:\tomcat9\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.8.0_172"
Using CLASSPATH:       "C:\tomcat9\bin\bootstrap.jar;C:\tomcat9\bin\tomcat-juli.jar"
Server version: Apache Tomcat/9.0.30
Server built:   Dec 7 2019 16:42:04 UTC
Server number:  9.0.30.0
OS Name:        Windows 10
OS Version:     10.0
Architecture:   amd64
JVM Version:    1.8.0_172-b11
JVM Vendor:     Oracle Corporation

★TomcatへのSSL対応処理

(1).keytoolを使用して、証明書ファイルの作成
(2).server.xmlのHTTPS通信設定 (Connector port="8443")

<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" >
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
<SSLHostConfig>
<Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
certificateFile="conf/localhost-rsa-cert.pem" certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA" />
</SSLHostConfig>
    </Connector>

◆手順5:コード サンプルの実行
1.POM.XMLの編集
C:\tmp\ms-identity-java-webapp\pom.xmlに下記dependencyを追加。
* pom.xmlファイル
5.pomxlm.PNG
* 追加する内容

 <dependency> 
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
 </dependency>

4.pom.png

2.MsalWebSampleApplication.javaの編集

C:\tmp\ms-identity-java-webapp2\src\main\java\com\microsoft\azure\msalwebsample\MsalWebSampleApplication.javaを下記内容に変更

6.java.png

 package com.microsoft.azure.msalwebsample;

 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

 @SpringBootApplication
 public class MsalWebSampleApplication extends SpringBootServletInitializer {

  public static void main(String[] args) {
   SpringApplication.run(MsalWebSampleApplication.class, args);
  }

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
   return builder.sources(MsalWebSampleApplication.class);
  }
 }

3.WARファイルの作成 (mvn package)

7.mvn.PNG

4.msal-web-sample-0.1.0.warをROOT.warに変更

『mvn package』を実行するとtargetフォルダが作成されて、warファイルが作成されますので、作成されたwarファイルをROOT.warに変更する。
*変更前
8.war.PNG
*変更後
9.ROOT.PNG

5.tomcat起動

C:\tomcat9\bin\Tomcat9w.exeを右クリック-> 管理者として実行 -> start

11.Tomcat.PNG

6.Root.warの配置

tomcat9\webapps\にROOT.warを配置すると自動的にROOTフォルダを作成がされる。このRootフォルダを使って、サインインすることになります。

10.move1.PNG

10.move2.PNG

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

*事前準備
(1).Fiddlerでパケットキャプチャの準備。
(2).ダウンロードしたコアプロジェクトサンプルの仕組みをきちんと確認。

flow.PNG

0.Tomcatを起動。
11.Tomcat.PNG

1.認可コードの取得(認可エンドポイント)
●1-1.『https://localhost:8443』へアクセスして、Proceed to localhost (unsafe)をクリック
1.signin.PNG

●1-2.Login to call Microsoft Graphが表示されますので、[Login]をクリック
2.login.PNG

●1-3.資格情報(ID/パスワード)の入力
●1-4.要求されているアクセス許可を承諾
3.consent.PNG
●1-5.ログイン完了
image.png

2.User Infoエンドポイントへのアクセス
2-1.[Show User Info]をクリック。
4.login.PNG
2-2.[承諾]をクリック。
5.consent-2.PNG
2-3.現在ログインしているユーザーの情報が表示されます。
6.userinfo.PNG

HTTPSを使う理由

●8080を利用すると下記エラーページが表示される。
ERROR PAGE.PNG

●理由
HTTPS通信を使っていない為、OAuthのstateパラメータの検証に失敗している。

なぜなら、Chrome 80 のSame-site Cookieの更新に伴い、ChromeがHTTPS通信、且つsame-site: none パラメータが付与されたcookieのみを、POSTリクエストに含めるよう変更があった為となります。

stateパラメータは、通常OAtuhのフローにてCSRF攻撃を防ぐためのパラメータとして使われ、本来ならば、下記流れで、認証を完了致します。(*1参照)

(1).認証リクエストの開始時に、アプリケーションのoriginのCookieにstateパラメータを保存し、同時に同じ値を認証リクエストのクエリーに含め Azure ADに渡される。
(2).Azure ADは認証完了後、stateパラメータを、もとのアプリケーションにクエリーパラメータとして引き回します。アプリケーションはこのstateのパラメータと、Cookieに保存されたstate パラメータの値を比較することにより、同一のユーザーエージェント (ブラウザー) からのアクセスであることを判断し、認証を完了させます。

HTTP通信で動作させた場合、アプリケーションが発行したCookieをブラウザーが保存できず、認証後にアプリケーションに戻った際、正常にCookieを送信できてない為、エラー表示となって、認証が完了できない状態になる(*2)ので、HTTPSが必須となります。

*1.『Microsoft ID プラットフォームと OAuth 2.0 認証コード フロー』
https://docs.microsoft.com/ja-jp/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code

パラメーター   説明
state 要求に含まれ、かつトークンの応答として返される値。 任意の文字列を指定することができます。 クロスサイトリクエストフォージェリ攻撃を防ぐために通常、ランダムに生成された一意の値が使用されます。 この値を使用すると、認証要求の前にアプリ内でユーザーの状態 (表示中のページやビューなど) に関する情報をエンコードすることもできます。

*2.
(1).認証リクエスト Set-Cookie : msal_web_app_auth_state=xxx
before1.PNG
(2).Cookeiが保存されていないので、認証に失敗する。
after1.PNG
Cookieが保存される場合は、下記となります。
noerror.PNG

まとめ

トークンの取得情報は別記事でアップロードさせていただきます。
次回も、Java Web アプリの検証を予定しております。今度は、Eclipseを使っての検証となります。

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

3
3
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
3
3