前回はAzure Active Directoryで認証を行いましたが、今回はAzure Active Directory B2C(以下B2C)でやっていきたいと思います。
B2Cそのものの説明はしないので、Azure Active Directory B2C のドキュメント | Microsoft Docs あたりを参考にしてください。
連携方法
連携方法としては、Spring Boot の標準ライブラリのみで行うか、Microsoftが提供しているB2C向けStarterを使うかのいずれかになります。
標準ライブラリを使った方法
構成は前回と同じです。同一プロジェクトに設定を同居できますので、プロジェクトを流用すればいいでしょう。次にプロパティファイルに以下を追加します。 azureadb2c
という名前でプロバイダを登録します。この名前は任意なので、変更しても構いません。
spring: security: oauth2: client: registration: azureadb2c: client-id: <<b2c client id>> client-secret : <<b2c client secret>> client-name: Azure Active Directory B2C scope: - openid - <<b2c client id>> client-authentication-method: post authorization-grant-type: authorization_code redirect-uri: http://localhost:8080/login/oauth2/code/azureadb2c provider: azureadb2c: token-uri: https://<<b2c tenant name>>.b2clogin.com/morisb2c.onmicrosoft.com/<<user flow name>>/oauth2/v2.0/token authorization-uri: https://<<b2c tenant name>>.b2clogin.com/morisb2c.onmicrosoft.com/<<user flow name>>/oauth2/v2.0/authorize user-name-attribute: name jwk-set-uri: https://<<b2c tenant name>>.b2clogin.com/morisb2c.onmicrosoft.com/<<user flow name>>/discovery/v2.0/keys
注意点としては、以下。
- Scopeには
openid
の他にクライアントIDを指定しないと認証に失敗します。ここで少しはまりましたが、B2CのDocsにもどこかにこっそり書いてあるはずです。 - URIの一部にサインイン用のユーザーフロー名が入るので、B2C側で作成したフロー名を指定してください。
この例では、パスワードリセットとユーザープロファイル編集は無視しています。 設定をするとログイン画面にB2C向けのリンクが表示されるはずなので、あとは普通に認証後にログイン出来ると思います。
B2C Starterを使った方法
以下の依存を追加するとB2C Starterを利用できます。
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>azure-active-directory-b2c-spring-boot-starter</artifactId> <version>2.2.5</version> </dependency>
この場合は以下の通りプロパティファイルには独自の設定をする必要があります。
azure: activedirectory: b2c: tenant: <<your tenant name>> oidc-enabled: true client-id: <<client id>> client-secret: <<client secret>> reply-url: http://localhost:8080/home logout-success-url: http://localhost:8080/logout user-flows: sign-up-or-sign-in: <<sign in flow name>> profile-edit: <<profile edit flow name>> password-reset: <<password reset flow name>.
こちらのStarterを使うとサインイン、ユーザープロファイル編集、パスワードリセットの3つのフローを設定するだけで扱えるようになります。URIも内部で処理してくれるので面倒くさくはありません。
あと、reply-url
をhttp://localhost:8080/
にするとうまく動作しなくなるので、 home
で受けて同じページを返すような処理が必要です(いまいちこのあたりの処理に精通していないので失敗原因がわかりません)
実行すると、例のログイン画面に3つでてくるでしょう。実際は、この画面を使うこともないでしょうし、うまく隠蔽してください。
まとめ
すべては後半のStarerを使ったやつはDocsにチュートリアルがありますので、そちらを参考にしてくれたほうがはかどると思います。とはいえ、内容が微妙に間違ってたり古くなってたり誤訳だったり、説明不足だったりすることが多いので、実際動かすのは手間がかかる場合もありあmす。
以上