Azure Active Directoryは、Azureが提供する認証基盤です。どちらかというと企業で使うアプリ(もちろんOffice 365やTeamsなども含む)で使われていて、あまり個人で使ってみたという話は聞きません。
対して、同じ認証基盤の機能を含むGoogleのFirebaseは解説記事も多く、Unity向けにも公式プラグインが出ているので、スマホアプリを中心にかなり利用ケースが多い印象です。
Azure Active Directoryもスケーラビリティや機能面でも優れていて、しかも個人アカウントでも無料から使えるのですがあまり周知されていない印象です。
同様にAzure Storageもかなり使い勝手がいいのに、Unity用プラグインがベータ版という位置づけで、正式版を出すという話は聞きません。
プラグインに関してはAzure ADも同様で、HoloLensのチュートリアル「MR と Azure 311-Microsoft Graph」でも、チュートリアル用に提供されているUnityプラグインを使って実装はするものの、その中身ははっきりしません。
このチュートリアルでも開設されているように、NuGetからプラグインをダウンロードしてきて自分で入れれば動くのですが、Firebaseのような純正プラグインに比べて格段に難易度が上がります。純正のUnityパッケージを用意してもらえるととても助かるのですが。。
本題です。
Azure Active Directory(以下AAD)で認証を行うには、Microsoft IDプラットフォームで提供されているSDK群を使用します。
このドキュメント類も膨大で、日本語訳はされているものの(されているから?)、前提知識なしに読み進めてもほとんど頭に入ってきません。なので、今回はUnityでの使用に絞って関連する部分だけを見ていきます。
ドキュメントにADALやMSALという言葉が出てきますが、ADALはサポート終了予定なので、これから取り組むにはMSAL一択とのことです。
で、結局MSALって何?と思いますが、Unityで使う分には、「Microsoft.Identity.Client.dll」で提供される「Microsoft.Identity.Client」名前空間のクラス群ということになります。
下記は、Microsoft.Identity.Clientを使ったサンプルの抜粋です(Unity用ではなく、WPFアプリ)
using Microsoft.Identity.Client; using System; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Interop; namespace active_directory_wpf_msgraph_v2 { public partial class MainWindow : Window { string graphAPIEndpoint = "https://graph.microsoft.com/v1.0/me"; string[] scopes = new string[] { "user.read" }; private async void CallGraphButton_Click(object sender, RoutedEventArgs e) { AuthenticationResult authResult = null; var app = App.PublicClientApp; ResultText.Text = string.Empty; TokenInfoText.Text = string.Empty; var accounts = await app.GetAccountsAsync(); var firstAccount = accounts.FirstOrDefault(); try { authResult = await app.AcquireTokenSilent(scopes, firstAccount) .ExecuteAsync(); } catch (MsalUiRequiredException ex) { // A MsalUiRequiredException happened on AcquireTokenSilent. // This indicates you need to call AcquireTokenInteractive to acquire a token System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}"); try { authResult = await app.AcquireTokenInteractive(scopes) .WithAccount(firstAccount) .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle) // optional, used to center the browser on the window .WithPrompt(Prompt.SelectAccount) .ExecuteAsync(); } catch (MsalException msalex) { ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}"; } } catch (Exception ex) { ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}"; return; } if (authResult != null) { //認証成功 } }
読んでみると、なんとなく「var app = App.PublicClientApp」で取得したappのメソッドを使って認証しているみたい、というのが伝わってきます。
続き↓