Spring Web アプリに Azure Active Directory B2C でのサインインを追加する
この記事では、Spring Initializr と Microsoft Entra ID 用 Spring Boot Starter
このチュートリアルでは、次の方法について説明します。
- Spring Initializr を使用して Java アプリケーションを作成する
- Azure Active Directory B2C の構成
- Spring Boot のクラスと注釈を使用してアプリケーションをセキュリティで保護する
- Java アプリケーションをビルドしてテストする
Microsoft Entra ID は、Microsoft のクラウド規模のエンタープライズ ID ソリューションです。 Azure Active Directory B2C は、Microsoft Entra ID の機能セットを補完し、企業間 (B2C) アプリケーションへの顧客、コンシューマー、市民のアクセスを管理できます。
前提 条件
- Azure サブスクリプション。 まだお持ちでない場合は、開始する前に 無料アカウント を作成してください。
- サポートされている Java Development Kit (JDK)。 Azure での開発時に使用できる JDK の詳細については、Azure および Azure Stackでの Java サポート
参照してください。 - Apache Maven バージョン 3.0 以上。
重要
この記事の手順を完了するには、Spring Boot バージョン 2.5 以降が必要です。
Spring Initializr を使用してアプリを作成する
https://start.spring.io/ を参照します。
このガイダンスに従って値を入力します。 ラベルとレイアウトは、次に示す画像と異なる場合があります。
- プロジェクトで、Maven プロジェクトを選択します。
- [言語] で、[Java] を選択します。
- Spring Bootの下で、2.7.11を選択します。
- グループの
、成果物 の 、そして名前の に、短く説明的な文字列を使用して同じ値を入力してください。 入力時に、これらのフィールドの一部が UI によって自動的に入力される場合があります。 - [依存関係
] のペインで、[依存関係の追加] を選択します。 UI を使用して、Spring Web と の依存関係、および Spring Security との依存関係を追加します。
手記
Spring Security 5.5.1、5.4.7、5.3.10、5.2.11 がリリースされ、CVE-2021-22119: spring-security-oauth2-clientによるサービス拒否攻撃
CVE レポートに対処しました。 以前のバージョンを使用している場合は、アップグレードしてください。 プロジェクトを生成を選択し、ローカルコンピュータ上のパスにプロジェクトをダウンロードします。 ダウンロードしたファイルをプロジェクトの名前の付いたディレクトリに移動し、ファイルを解凍します。 ファイル レイアウトは次のようになります。
yourProject
の代わりに Group に入力した値を指定します。. ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main │ ├── java │ │ └── yourProject │ │ └── yourProject │ │ └── YourProjectApplication.java │ └── resources │ ├── application.properties │ ├── static │ └── templates └── test └── java └── yourProject └── yourProject └── YourProjectApplicationTests.java
Microsoft Entra インスタンスを作成して初期化する
Active Directory インスタンスを作成する
https://portal.azure.comにログインします。
[リソースの作成] を選択します。 Azure Active Directory B2C を検索します。
[作成] を選択します。
Azure Active Directory B2C の Azure Marketplace エントリを
[Create a new Azure AD B2C Tenant](新しい Azure AD B2C テナントの作成) を選択します。
Azure AD B2C テナントを新しく作成するための Azure ポータル オプションを選択する
「
組織名 」と「初期ドメイン名 」に適切な値を指定し、「を作成」を選択します。 [Azure AD B2C テナントの作成] 画面を
Active Directory の作成が完了したら、右上隅にあるアカウントを選択し、ディレクトリの切り替えを選択してから、作成したディレクトリを選択します。 新しいテナントのホーム ページにリダイレクトされます。 次に、
b2c
を検索して、を選択し、Azure AD B2Cを選びます。
Spring Boot アプリのアプリケーション登録を追加する
[管理] ウィンドウで、[アプリの登録] を選択し、[新しい登録] を選択します。
[Name] フィールドにアプリの名前を入力し、[登録]を選択します。
Azure AD B2C
[ の管理] ウィンドウに戻り、[アプリの登録]を選択し、作成したアプリケーション名を選択します。
認証を選択し、次に プラットフォームの追加 を選択し、それから Webを選択します。 [リダイレクト URI] を
http://localhost:8080/login/oauth2/code/
に設定し、[構成] を選択します。
アプリにシークレットを追加する
証明書 & シークレットを選択し、新しいクライアント シークレットを作成します。 シークレットの説明を入力して、[を追加] を選択します。 シークレットを作成したら、シークレット値の横にあるコピー アイコンを選択して、この記事の後半で使用するために値をコピーします。
手記
証明書 & シークレット セクションに戻ると、シークレットの値は表示されません。 その場合は、別のシークレットを作成し、後で使用できるようにコピーする必要があります。 場合によっては、生成されたシークレット値に、バックスラッシュやバックティックなど、application.yml ファイルに含めるのに問題がある文字が含まれている場合があります。 その場合は、そのシークレットを破棄し、別のシークレットを生成します。
ユーザー フローの追加
テナントのメイン ページに移動します。 左側のウィンドウの [
ポリシー ] セクションで、[ユーザー フロー] を選択し、[新しいユーザー フロー 選択します。 このチュートリアルを終了し、別のチュートリアルを実行し、完了したらこのチュートリアルに戻ります。 他のチュートリアルに進むときに留意すべき点を次に示します。
- 新しいユーザーフローを選択するように要求される手順から始めます。
- このチュートリアルで
webapp1
を参照する場合は、代わりに、あなたが入力した の値をグループ に使用します。 - フローから返す要求を選択するときは、表示名 が選択されていることを確認します。 この要求がないと、このチュートリアルでビルドされているアプリは機能しません。
- ユーザー フローの実行を求められたら、前に指定したリダイレクト URL はまだアクティブではありません。 フローは引き続き実行できますが、リダイレクトは正常に完了しません。 これは想定されています。
- "次のステップ" に達したら、このチュートリアルに戻ります。
チュートリアル: Azure Active Directory B2Cで、"サインアップとサインイン"、"プロファイル編集"、および"パスワードリセット"のユーザーフローを作成するための手順に従います。
Azure AD B2C では、ローカル アカウントとソーシャル ID プロバイダーがサポートされています。 GitHub ID プロバイダーの作成例については、「Azure Active Directory B2Cを使用して GitHub アカウントでサインアップとサインインを設定する」を参照してください。
アプリを構成してコンパイルする
Azure AD B2C インスタンスと一部のユーザー フローを作成したので、Spring アプリを Azure AD B2C インスタンスに接続します。
コマンド ラインから、Spring Initializr からダウンロードした .zip ファイルを解凍したディレクトリに cd を移動します。
プロジェクトの親フォルダーに移動し、テキスト エディターで pom.xml Maven プロジェクト ファイルを開きます。
Spring OAuth2 セキュリティの依存関係を pom.xmlに追加します。
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-active-directory-b2c</artifactId> <version>See Below</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>See Below</version> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> <version>See Below</version> </dependency>
spring-cloud-azure-starter-active-directory-b2c
では、使用可能な最新バージョンを使用します。 あなたは、mvnrepository.com を使ってこれを調べることができるかもしれません。spring-boot-starter-thymeleaf
では、上で選択した Spring Boot のバージョンに対応するバージョンを使用します (例:2.3.4.RELEASE
)。thymeleaf-extras-springsecurity5
の場合は、使用可能な最新バージョンを使用します。 mvnrepository.com を使用して調べることができるかもしれません。 この執筆時点で、最新バージョンは3.0.4.RELEASE
。pom.xml ファイルを保存して閉じます。
mvn -DskipTests clean install
を実行して、依存関係が正しいことを確認します。BUILD SUCCESS
が表示されない場合は、トラブルシューティングを行い、問題を解決してから続行してください。
プロジェクト内の src/main/resources フォルダーに移動し、テキスト エディターで application.yml ファイルを作成します。
前に作成した値を使用して、アプリ登録の設定を指定します。例えば:
spring: cloud: azure: active-directory: b2c: enabled: true base-uri: https://<your-tenant-initial-domain-name>.b2clogin.com/<your-tenant-initial-domain-name>.onmicrosoft.com/ credential: client-id: <your-application-ID> client-secret: '<secret-value>' login-flow: sign-up-or-sign-in logout-success-url: <your-logout-success-URL> user-flows: sign-up-or-sign-in: <your-sign-up-or-sign-in-user-flow-name> profile-edit: <your-profile-edit-user-flow-name> password-reset: <your-password-reset-user-flow-name> user-name-attribute-name: <your-user-name-attribute-name>
client-secret
値は一重引用符で囲まれています。 これは、<secret-value>
の値には、YAML に存在する場合に一重引用符内に含める必要がある一部の文字がほぼ確実に含まれるためです。手記
このドキュメントの執筆時点で、application.yml で使用できる Active Directory B2C Spring Integration 値の完全な一覧は次のとおりです。
spring: cloud: azure: active-directory: b2c: enabled: true base-uri: credential: client-id: client-secret: login-flow: logout-success-url: user-flows: sign-up-or-sign-in: profile-edit: # optional password-reset: # optional user-name-attribute-name:
application.yml ファイルは、spring-cloud-azure-starter-active-directory-b2c サンプル: GitHub の aad-b2c-web-application で入手できます。
application.yml ファイルを保存して閉じます。
src/main/java/<yourGroupId>/<yourGroupId>に コントローラー という名前のフォルダーを作成し、
<yourGroupId>
Groupに入力した値に置き換えます。コントローラー フォルダーに WebController.java という名前の新しい Java ファイルを作成し、テキスト エディターで開きます。
次のコードを入力し、
yourGroupId
を適切に変更してから、ファイルを保存して閉じます。package yourGroupId.yourGroupId.controller; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class WebController { private void initializeModel(Model model, OAuth2AuthenticationToken token) { if (token != null) { final OAuth2User user = token.getPrincipal(); model.addAttribute("grant_type", user.getAuthorities()); model.addAllAttributes(user.getAttributes()); } } @GetMapping(value = "/") public String index(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "home"; } @GetMapping(value = "/greeting") public String greeting(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "greeting"; } @GetMapping(value = "/home") public String home(Model model, OAuth2AuthenticationToken token) { initializeModel(model, token); return "home"; } }
コントローラー内のすべてのメソッドは
initializeModel()
を呼び出し、そのメソッドはmodel.addAllAttributes(user.getAttributes());
を呼び出すので、src/main/resources/templates 内のすべての HTML ページは、${name}
、${grant_type}
、${auth_time}
などの属性にアクセスできます。user.getAttributes()
から返される値は、実際には認証のid_token
の要求です。 使用可能な要求のすべてのリストは、Microsoft アイデンティティ プラットフォーム ID トークンに記載されています。 src/main/java/ にセキュリティyourGroupId / yourGroupId という名前のフォルダーを作成し、 を Group に入力した値に置き換えます。セキュリティ フォルダーに WebSecurityConfiguration.java という名前の新しい Java ファイルを作成し、テキスト エディターで開きます。
次のコードを入力し、
yourGroupId
を適切に変更してから、ファイルを保存して閉じます。package yourGroupId.yourGroupId.security; import com.azure.spring.cloud.autoconfigure.aadb2c.AadB2cOidcLoginConfigurer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { private final AadB2cOidcLoginConfigurer configurer; public WebSecurityConfiguration(AadB2cOidcLoginConfigurer configurer) { this.configurer = configurer; } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest() .authenticated() .and() .apply(configurer) ; } }
home.html ファイルspring-cloud-azure-starter-active-directory-b2c サンプル: aad-b2c-web-application から src/main/resources/templatesにコピーし、 と を前に作成したユーザー フローの名前に置き換えます。
アプリをビルドしてテストする
コマンド プロンプトを開き、アプリの pom.xml ファイルがあるフォルダーにディレクトリを変更します。
Maven を使用して Spring Boot アプリケーションをビルドし、実行します。例えば:
手記
ローカル の Spring Boot アプリが実行されるシステム クロックに従った時間が正確であることが非常に重要です。 OAuth 2.0 を使用する場合、クロック スキューの許容度はほとんどありません。 3 分間の不正確さでも、
[invalid_id_token] An error occurred while attempting to decode the Jwt: Jwt used before 2020-05-19T18:52:10Z
のようなエラーでサインインが失敗する可能性があります。 この執筆時点で、time.gov は実際の時間からクロックがどの程度離れているかを示す指標を持っています。 アプリは 、+0.019 秒のスキューで正常に実行されました。mvn -DskipTests clean package mvn -DskipTests spring-boot:run
Maven によってアプリケーションがビルドおよび起動されたら、Web ブラウザーで
http://localhost:8080/
を開きます。ログイン ページにリダイレクトされます。Webアプリのログインページ
サインインに関連するテキストを含むリンクを選択します。 認証プロセスを開始するには、Azure AD B2C にリダイレクトする必要があります。
正常にログインすると、ブラウザーからサンプル
home page
が表示されます。
トラブルシューティング
以下のセクションでは、発生する可能性のあるいくつかの問題を解決する方法について説明します。
属性に属性名がありません
サンプルの実行中に、メッセージ Missing attribute 'name' in attributes
で例外が発生する場合があります。 この例外のログは、次の出力のようになります。
java.lang.IllegalArgumentException: Missing attribute 'name' in attributes
at org.springframework.security.oauth2.core.user.DefaultOAuth2User.<init>(DefaultOAuth2User.java:67) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser.<init>(DefaultOidcUser.java:89) ~[spring-security-oauth2-core-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:144) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
at org.springframework.security.oauth2.client.oidc.userinfo.OidcUserService.loadUser(OidcUserService.java:63) ~[spring-security-oauth2-client-5.3.6.RELEASE.jar:5.3.6.RELEASE]
このエラーが発生した場合は、「チュートリアル: Azure Active Directory B2Cでユーザー フローを作成する」で作成したユーザー ワークフローを再確認します。 ユーザー ワークフローを作成するときは、ユーザー属性と要求の中から、表示名の属性と要求を必ず選択してください。 また、application.yml ファイルで user-name-attribute-name
を正しく構成してください。
ループを使用して B2C エンドポイントにサインインする
この問題は、localhost
の汚染されたクッキーが原因である可能性が最も高いです. localhost
の Cookie をクリーンアップし、もう一度やり直してください。
概要
このチュートリアルでは、Azure Active Directory B2C スターターを使用して新しい Java Web アプリケーションを作成し、新しい Azure AD B2C テナントを構成し、その中に新しいアプリケーションを登録した後、Spring 注釈とクラスを使用して Web アプリを保護するようにアプリケーションを構成しました。
リソースのクリーンアップ
不要になったら、azure portal
次の手順
Spring と Azure の詳細については、Spring on Azure ドキュメント センターに進んでください。