Azure AD認証をUnityで使う(1)

Azure Active Directoryは、Azureが提供する認証基盤です。どちらかというと企業で使うアプリ(もちろんOffice 365やTeamsなども含む)で使われていて、あまり個人で使ってみたという話は聞きません。
対して、同じ認証基盤の機能を含むGoogleのFirebaseは解説記事も多く、Unity向けにも公式プラグインが出ているので、スマホアプリを中心にかなり利用ケースが多い印象です。

Azure Active Directoryもスケーラビリティや機能面でも優れていて、しかも個人アカウントでも無料から使えるのですがあまり周知されていない印象です。

同様にAzure Storageもかなり使い勝手がいいのに、Unity用プラグインがベータ版という位置づけで、正式版を出すという話は聞きません。

Azure Blob Storageとは UnityからAzure Blob Storageにアクセスしてファイルをダウンロード&アップロ...

プラグインに関してはAzure ADも同様で、HoloLensのチュートリアル「MR と Azure 311-Microsoft Graph」でも、チュートリアル用に提供されているUnityプラグインを使って実装はするものの、その中身ははっきりしません。

このコースでは、Mixed Reality アプリケーション内で Microsoft Graph を活用し、生産性を向上させるデータに接続する方法について説明します。

このチュートリアルでも開設されているように、NuGetからプラグインをダウンロードしてきて自分で入れれば動くのですが、Firebaseのような純正プラグインに比べて格段に難易度が上がります。純正のUnityパッケージを用意してもらえるととても助かるのですが。。

Microsoft ID プラットフォーム

本題です。

Azure Active Directory(以下AAD)で認証を行うには、Microsoft IDプラットフォームで提供されているSDK群を使用します。

OAuth 2.0 および OpenID Connect (OIDC) で Microsoft Entra を使用して、ビルドするアプリと Web API を保護します。 Microsoft が提供するクイックスタート、チュートリアル、コード サンプル、API リファレンス ドキュメントを使用して、ユーザーのサインイン...

このドキュメント類も膨大で、日本語訳はされているものの(されているから?)、前提知識なしに読み進めてもほとんど頭に入ってきません。なので、今回はUnityでの使用に絞って関連する部分だけを見ていきます。

Microsoft Authentication Library (MSAL)

ドキュメントにADALやMSALという言葉が出てきますが、ADALはサポート終了予定なので、これから取り組むにはMSAL一択とのことです。

Microsoft Authentication Library (MSAL) を使用すると、アプリケーション開発者はセキュリティで保護された Web API を呼び出すためにトークンを取得できます。 これらの Web API には、Microsoft Graph、その他の Microsoft API、サード パーティ...

で、結局MSALって何?と思いますが、Unityで使う分には、「Microsoft.Identity.Client.dll」で提供される「Microsoft.Identity.Client」名前空間のクラス群ということになります。

下記は、Microsoft.Identity.Clientを使ったサンプルの抜粋です(Unity用ではなく、WPFアプリ)

Sample showing how a Windows desktop .NET (WPF) application can get an access token using MSAL.NET and call the Microsoft Graph API or other APIs protected by t...
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のメソッドを使って認証しているみたい、というのが伝わってきます。

続き↓

前回の続きです Azure AD認証をUnityから使うには、MSAL(Microsoft.Identity.Client名前...
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク