2019年4月11日木曜日

[Azure AD B2C]各種エンドポイントにつくポリシー指定用パラメータが邪魔な件

こんにちは、富士榮です。

完全に自分メモです。
Azure Active Directory B2Cって色々と器用なことが出来るのですが、その動作はポリシー(ユーザーフロー)という単位で定義され、クライアント(アプリケーション)から呼び出されます。
図)標準のポリシー(ユーザーフロー)定義

図)カスタムポリシー

サインアップとか、サインインとか、プロファイル編集などなど、各種動作を統一されたエンドポイントで実行するために、このポリシーを各種エンドポイントを呼び出す際、「https://hoge.b2clogin.com/hoge.onmicrosoft.com/oauth2.0/v2.0/authorize?p=B2C_1_XXXX」のようにクエリパラメータにp=ポリシー名という形でポリシーを指定して動きを変えていきます。

※ちなみにポリシー名のPrefixは、
・標準ポリシー(ユーザーフロー)だと、「B2C_1_XXX」
・カスタムポリシーだと、「B2C_1A_XXX」
です。

しかし、OAuthやOpenID Connectの非MS製ライブラリを使うとき、かなりの確率で問題になるのが、エンドポイントにクエリパラメータが付いた状態がスタート、というところです。

なぜなら、よくあるライブラリにはエンドポイントアドレスを設定、client_idなど各エンドポイントへのアクセスを行う際にクエリ指定するパラメータは個別に指定、ライブラリが自動的に
 https://hogehoge.com/oauth2/authorize?client_id=aaa....
みたいに連結して動こうとするため、最初からエンドポイントアドレスにクエリが付いているAzure AD B2Cだと、
 https://hogehoge.com/oauth2/authorize?p=B2C_A_xxx?client_id=aaa....
のように?をつけてしまったりするんです。※本来はもともとパラメータが付いているので、追加パラメータは&で繋いでほしいのですが、想定されてないのだと思います。


ということで、今回はAzure AD B2Cのエンドポイントアドレスにクエリパラメータを使わない方法の紹介です。

といっても単純に以下を使うだけです。
(.well-known/openid-configurationのアドレスです。これを叩けば対応するauthorizationとかtokenエンドポイントのアドレスが取れます)

ドメインデフォルト(パラメータあり)パラメータ無
b2cloginhttps://テナント名.b2clogin.com/テナント名.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_ポリシー名https://テナント名.b2clogin.com/tfp/テナント名.onmicrosoft.com/B2C_1_ポリシー名/v2.0/.well-known/openid-configuration
onmicrosoft(非推奨)https://login.microsoftonline.com/テナント名.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1_ポリシー名https://login.microsoftonline.com/te/テナント名.onmicrosoft.com/B2C_1_ポリシー名/v2.0/.well-known/openid-configuration


エンドポイントアドレスがかなり長いですが、既存のクライアントとの連携などを行う場合は、こちらを使った方がベターです。