MRが楽しい

MRやVRについて学習したことを書き残す

Microsoft Authentication Library(MSAL)を使ってHoloLens2でOpenIDConnectの認可コードフローを試す その3(トークンキャッシュをクリアする)

本日はHoloLens2の小ネタ枠です。
Microsoft Authentication Library(MSAL)を使ってHoloLens2でOpenIDConnectの認可コードフローを行う方法を記事にします。
本記事はトークンキャッシュをクリアする方法についてです。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

トークンキャッシュをクリアする

RemoveAsync関数を利用するとアカウントを指定してアプリケーション内に保存されているユーザー・トークンのキャッシュを削除できます。
あらかじめGetAccountsAsync関数で全てのアカウントの参照を取得することで、保存されている全てのキャッシュを削除できます。
learn.microsoft.com

var app = PublicClientApplicationBuilder.Create(clientId).Build();
// 利用可能なユーザー・トークンのリストを取得する
var accounts = await app.GetAccountsAsync();
// アカウント情報を削除する
foreach (var account in accounts)
{
    await app.RemoveAsync(account);
}

サンプルスクリプト

前回記事で作成したサンプルスクリプトに以下の処理を追加しました。
Removeボタンを押下すると、キャッシュされているトークンを全て削除します。
・AzureMsalTest.cs

    [SerializeField]
    private Interactable removeButton;
~~~ 中略 ~~~

        removeButton.OnClick.AddListener(async () =>
        {
            var argTenantId = tenantId;
            var argClientId = clientId;
            var argScopes = scopes;
            var argLoginHint = loginHint;
            
#if WINDOWS_UWP
            string[] scopeList = { "openid", "profile", "offline_access", argScopes };
            try
            {
                var app = Microsoft.Identity.Client
                    .PublicClientApplicationBuilder
                    .Create(argClientId)
                    .WithAuthority(
                        Microsoft.Identity.Client.AzureCloudInstance.AzurePublic,
                        argTenantId)
                    .WithRedirectUri("http://localhost:50000/")
                    .Build();

                var accounts = await app.GetAccountsAsync();

                // 全てのアカウント情報をパネルに表示する
                string logTextString = "GetAccountsAsync" + Environment.NewLine;
                foreach (var account in accounts)
                {
                    logTextString += $"{account.Username},{account.HomeAccountId},{account.Environment}" + Environment.NewLine;
                }
                
                // アカウント情報を削除する
                foreach (var account in accounts)
                {
                    await app.RemoveAsync(account);
                }
                
                var resultAccounts = await app.GetAccountsAsync();

                logTextString += "RemoveAsync" + Environment.NewLine;
                // 全てのアカウント情報をパネルに表示する
                foreach (var resultAccount in resultAccounts)
                {
                    logTextString += $"{resultAccount.Username},{resultAccount.HomeAccountId},{resultAccount.Environment}" + Environment.NewLine;
                }
                logText.text = logTextString;
            }
            catch (Exception e)
            {
                logText.text =  "Remove error";
            }
#endif
        });

動作確認

プロジェクトを再ビルドしてHoloLens2にデプロイします。
Removeボタンを押すと、アプリ内にキャッシュされている全てのトークンを削除できました。