kamulog

xamarin.formsのネタなど

Sign in with Apple を Azure AD B2C で使う時にどハマりしたこと

Azure Active Directory B2C を復習帳というアプリで利用してます。 これを導入した理由は、認証がめんどくさくて丸投げしたくて、Functionsなど他でAzure使ってるので 合わせてAzureで良いかという安易な理由からでした。

さて、Sign in with Apple の必須化までもう少しです。 てっきり私は、AD B2C も対応するだろうと思ってました。 しかし、このギリギリになってもサポートなし。 一応 カスタム OpenID で追加可能なサンプルはあるものの、他の主要プロバイダーのように公式のテンプレートはありません。

samples/policies/sign-in-with-apple at master · azure-ad-b2c/samples · GitHub

いや、めんどくさいのが嫌で導入したのにめんどくさいことするの勘弁して欲しいですよね。 B2Cと言うからにはがんばって対応しろよと思うんですが、こればっかりはもうどうにもならないので サンプルどおりに進めることにしました。

ハマりポイント

基本的にこのサンプル通りに進めていけばOKでした。

samples/policies/sign-in-with-apple at master · azure-ad-b2c/samples · GitHub

JWTの部分はこちらのruby版を使用しました。こちらの記事もかなり詳しく Sign in with Apple の導入手順を説明しているのでおすすめです。

What the Heck is Sign In with Apple? | Okta Developer

試しにユーザーフローから実行してみると、ちゃんとAppleIDの認証のページに飛んで認証できました。 ただ認証後に飛ばされるリダイレクトで Bad Request となってしまいました。

アプリで試すと、こちらも認証はOKでリダイレクトでBad Requestとは出ないものの真っ白ページが表示されてWebViewからアプリに応答が戻って来ませんでした。

結論からいうと問題は2つあり、Bad Request は AD B2C のリダイレクトURIの設定、アプリの方の問題は MSAL(MSの認証ライブラリ)の認証メソッドのオプションの問題でした。

AD B2C のリダイレクトURI の設定

AD B2C のホームから「アプリの登録」→ 対象のアプリ → リダイレクト URI のページに飛びます。 そこに developer.apple.com の Service ID のとこで指定した Return URL を設定します。

f:id:kamusoft:20200607132026p:plain

これで Bad Request は出なくなりました。

AD B2C を初めて設定してからかなり時間がたったので、この存在を完全に忘れてました。 最初から順番に設定していく場合は、この問題には遭遇しないかもしれません。

MSAL のオプション

以下の通りです。これだけでApple認証後にアプリに戻って完了できるようになりました。

authResult = await _client.AcquireTokenInteractive(Scopes)
    .WithParentActivityOrWindow(UIParent)
    .WithAccount(GetAccountByPolicy(acounts, PolicySignUpSignIn))
    .WithPrompt(Prompt.SelectAccount)
    .WithUseEmbeddedWebView(true) // これ
    .ExecuteAsync();

WithUseEmbeddedWebViewの指定は、公式サンプルの方にはその記述はなかったのですが

GitHub - Azure-Samples/active-directory-b2c-xamarin-native: This is a simple Xamarin Forms app showcasing how to use MSAL to authenticate users via Azure Active Directory B2C, and access a Web API with the resulting tokens.

こちらの記事のサンプルにありました。

Implementing MSAL + AAD B2C in Xamarin – 6 Tips, Tricks and Facts – Dylan Berry

しかし MSAL 破壊的変更が毎回多すぎる…

追記1

上記の対応は Sign in with Apple では有効ですが、今度は Google のこの問題に対応できなくなってしまうという…

https://docs.microsoft.com/ja-jp/azure/active-directory/develop/msal-net-aad-b2c-considerations#google-auth-and-embedded-webview

Google OAuth は、AD B2C の新しい b2clogin.com ドメインだと埋め込みWebViewでは機能しないということなので、Apple使うとGoogleが死ぬという問題が 発生してしまいます。

これは一旦、旧 microsoftonline.com を使い続け、廃止される2020年末までに対策を考えるしかないかも知れません。 ただ、Appleの方の問題はMSALの問題っぽいので、ちょっとフォークしていろいろ試してみようと思います。

しかし、結構クリティカルな問題なのに、Web上ではほとんど情報が無い。多分、AD B2C をアプリ認証に使ってるのは世界で私一人なんだと思います笑

追記2

iOS 13の不具合だったようで、普通に既出でした。13.4以降だとシステムブラウザ利用しても通りました。 これで、Googleの問題も解消できます。

github.com

AzureADチームは重複issueにも関わらずかなり素早く対応してくれてありがたかったです。 しばらくは使い続けようと思いました笑

その他所見

Sign in with Apple に使う AppID に関してですが、アプリ本体のAppIDを使うのが一般的だと思いますが、 これにグループ用のAppIdを指定することも可能で、そうすることで複数のアプリで同一の認証で通るようになるようです、多分。 個別のアプリのAppIDを指定した場合は、それぞれのアプリで別の認証になるのだと思います。これも推測ですが笑

ただし、グループ用に新規に作ったAppIDにはアプリの実体がないため、認証の際に表示されるアイコンがデフォルトのものになってしまいます。 一方アプリのIDを使えば公開されているアイコンが表示されます。 この辺ゴリ押しするからにはAppleも何とかしろよと思いますが…

公式のフォーラムにも意見は上がってますね。

Custom icon in web login |Apple Developer Forums

おわりに

結果として Azure AD B2C でも Sign in with Apple は利用可能でした。 ただ今回みたいに絶対に対応しないといけないことに対して公式サポートがないのは痛すぎるなという感想です。

認証サービス選びはくれぐれも慎重に!