MRが楽しい

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

Microsoft Authentication Library(MSAL)を使ってHoloLens2でOpenIDConnectの認可コードフローを試す その4(スコープで複数のリソースを要求する)

本日はHoloLens2の小ネタ枠です。
Microsoft Authentication Library(MSAL)を使ってHoloLens2でOpenIDConnectの認可コードフローを行う方法を記事にします。
本記事はスコープで複数のリソースを要求する方法についてです。

前回記事

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

スコープで複数のリソースを要求する

WithExtraScopesToConsent関数を利用すると、AcquireTokenInteractiveによるユーザ認証時に複数リソースのスコープの認可を得ることができます。
認証の結果、取得されるアクセストークンはAcquireTokenInteractiveの引数で指定したスコープに対するアクセストークンになります。
認証完了後、AcquireTokenSilentを使って指定のスコープのアクセストークンが取得できます。
learn.microsoft.com

// Interactiveで取得するアクセストークンのスコープ
string[] scopes = { "https://graph.microsoft.com/User.Read.All" };

// 合わせて認可を得る別のリソースのスコープ
string[] extraScopes = { "https://microsoft.sharepoint-df.com/AllSites.Read" };

AuthenticationResult result;
result = await app.AcquireTokenInteractive(scopes)
    .WithExtraScopesToConsent(extraScope)
    .ExecuteAsync();

サンプルスクリプト

前回記事で作成したサンプルスクリプトに以下の処理を追加しました。
認証を行うと、一度の認証操作で異なる2つのリソースのアクセストークンを取得できるようになります。
・AzureMsalTest.cs

// Interactiveで取得するアクセストークンのスコープ
string[] scopes = { "https://graph.microsoft.com/User.Read.All" };

// 合わせて認可を得る別のリソースのスコープ
string[] extraScopes = { "https://microsoft.sharepoint-df.com/AllSites.Read" };

var app = PublicClientApplicationBuilder
    .Create(applicationID)
    .WithAuthority(AzureCloudInstance.AzurePublic, directoryID)
    .WithRedirectUri("http://localhost:50000/")
    .Build();

// ユーザー名を指定してログインする
string username = loginUsername.text;

// ユーザ認証を行う
AuthenticationResult result;
result = await app.AcquireTokenInteractive(scopes)
    .WithLoginHint(username)
    .WithExtraScopesToConsent(extraScope)
    .ExecuteAsync();

// アクセストークンを取得する
var accessToken = result.AccessToken;

// キャッシュを利用して異なるスコープのトークンを取得する
var continuedAccount = accounts.FirstOrDefault(a => a.Username == username);
result = await app.AcquireTokenSilent(extraScopes, continuedAccount)
    .ExecuteAsync();

// アクセストークンを取得する
var extraAccessToken = result.AccessToken;

エラーが発生する場合

AcquireTokenSilentで正常にアクセストークンを取得できない場合があります。
以下のエラーが原因である可能性があるのでこちらの記事の対処を実施してみてください。
bluebirdofoz.hatenablog.com