はじめに(背景)
下記検証の続きとなります。
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として進めさせて頂きます。理由は、後ほど、解説致します。
(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] -> [アプリの登録]へ進む。
4.アプリケーション登録で下記項目を選択して、[登録]をクリック。
(1).名前欄:任意のアプリケーション名を入力
(2).サポートされているアカントの種類:この組織ディレクトリのみに含まれるアカウント
(3).リダイレクトURL:空白 => (後ほど、入力されます。)
5.登録したアプリケーションが表示されますので、[クイックスタート]をクリック。
8.下記構成内容が表示されますので、[更新する]をクリック。
(1).リダイレクト URI :
http://localhost:8080/msal4jsample/secure/aad
http://localhost:8080/msal4jsample/graph/me
(2).クライアントシークレット
- 認可コードフローとなりますので、アクセストーンとIDトークンのチェックは無しとなっております。
9.クライアントシークレットが表示されますので、コピーをして、[完了]をクリック。
- クライアントシークレットは以降の手順で必要となりますので、必ずコピーをお願い致します。
10.下記の[認証]画面から応答URLをhttpsに変更にして、[保存]をクリック。
*私の環境では、8080が他サービスと競合しておりますので、8443にポート番号も変えております。
[変更前]
[変更後]
◆手順2:プロジェクトのダウンロード
1.warを作成する為のプロジェクトファイルをダウンロードします。
プロジェクトファイル:ms-identity-java-webapp-master.zip
◆手順3:コード サンプルの構成
1.ZIP ファイルをローカル フォルダーに展開します。
2.src\main\resources\のapplication.propertiesファイルを編集致します。
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 |
*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ファイル
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
2.MsalWebSampleApplication.javaの編集
C:\tmp\ms-identity-java-webapp2\src\main\java\com\microsoft\azure\msalwebsample\MsalWebSampleApplication.javaを下記内容に変更
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)
4.msal-web-sample-0.1.0.warをROOT.warに変更
『mvn package』を実行するとtargetフォルダが作成されて、warファイルが作成されますので、作成されたwarファイルをROOT.warに変更する。
*変更前
*変更後
5.tomcat起動
C:\tomcat9\bin\Tomcat9w.exeを右クリック-> 管理者として実行 -> start
6.Root.warの配置
tomcat9\webapps\にROOT.warを配置すると自動的にROOTフォルダを作成がされる。このRootフォルダを使って、サインインすることになります。
◆手順6: サインイン
*事前情報
Fiddlerログを基にトークンの取得情報を途中まで書いたのですが、長くなってしまったので、別記事でアップロードさせていただきます。
*事前準備
(1).Fiddlerでパケットキャプチャの準備。
(2).ダウンロードしたコアプロジェクトサンプルの仕組みをきちんと確認。
1.認可コードの取得(認可エンドポイント)
●1-1.『https://localhost:8443』へアクセスして、Proceed to localhost (unsafe)をクリック
●1-2.Login to call Microsoft Graphが表示されますので、[Login]をクリック
●1-3.資格情報(ID/パスワード)の入力
●1-4.要求されているアクセス許可を承諾
●1-5.ログイン完了
2.User Infoエンドポイントへのアクセス
2-1.[Show User Info]をクリック。
2-2.[承諾]をクリック。
2-3.現在ログインしているユーザーの情報が表示されます。
HTTPSを使う理由
●理由
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
(2).Cookeiが保存されていないので、認証に失敗する。
Cookieが保存される場合は、下記となります。
まとめ
トークンの取得情報は別記事でアップロードさせていただきます。
次回も、Java Web アプリの検証を予定しております。今度は、Eclipseを使っての検証となります。
最後に、私の記事が少しでも、皆様の役に立てれば幸いでございます。