Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Spring Boot と Azure AD B2Cの連携

前回は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-urlhttp://localhost:8080/にするとうまく動作しなくなるので、 homeで受けて同じページを返すような処理が必要です(いまいちこのあたりの処理に精通していないので失敗原因がわかりません)

実行すると、例のログイン画面に3つでてくるでしょう。実際は、この画面を使うこともないでしょうし、うまく隠蔽してください。

f:id:StateMachine:20200806103142p:plain

まとめ

すべては後半のStarerを使ったやつはDocsにチュートリアルがありますので、そちらを参考にしてくれたほうがはかどると思います。とはいえ、内容が微妙に間違ってたり古くなってたり誤訳だったり、説明不足だったりすることが多いので、実際動かすのは手間がかかる場合もありあmす。

docs.microsoft.com

以上