Azure AD認証をUnityから使う(3)

なんと前回の投稿から1年近く経ってしまいました。

Azure Active Directoryは、Azureが提供する認証基盤です。どちらかというと企業で使うアプリ(もちろんOffice 3...
前回の続きです Azure AD認証をUnityから使うには、MSAL(Microsoft.Identity.Client名前...

UnityからAD認証をするには、まずNuGetまたは手動でMicrosoft.Identity.ClientのDLLを取得しよう、という話でした。

ここでそもそも論に立ち返りますが、Azure Active Directoryでの「認証」とは何か、という話になります。

Microsoft ID プラットフォームの認証と承認の基本について説明します。

公式ドキュメントには、AADでアプリやWebサイトに認証の仕組みを組み込むには、OAuth 2.0やOpenID Connectを使用する、ということが記載されています。OAuth 2.0もOpenID Connectも、AAD独自の仕組みではなくRFCで定義された共通規格になります。

・OAuth 2.0は「承認(認可)」の仕組みで、「認証」を内包している
・OpenID ConnectはOAuth 2.0を使った「認証」の仕組み

ということをざっくり理解しておくとわかりやすいです。
また、OAuth 2.0のフローは下記ページでわかりやすく解説されています。

はじめに過去三年間、技術者ではない方々に OAuth(オーオース)の説明を繰り返してきました※1,※2。その結果、OAuth をかなり分かりやすく説明することができるようになりました。この記事では…

そういう観点で、以前の投稿で参考にすると紹介したMS公式のサンプルを見てみると「AADを認可サーバーとしてOAuthのトークンをもらい、それを使ってGraph APIにアクセスする」という内容になっています。なので、AADに特化した仕組みではなく一般的なOAuthの仕組みを使っている、ということになります。

さっそくUnity向けのソースコードを記載します。

Startで、OAuthのトークンを取得して、そのトークンを使ってリソース(Graph API)にアクセスしている、という流れがわかりやすいのではないでしょうか。ちなみにこれはUnity EditorやPC向けビルドでしか動かないと思います。

これを動かすには、Auzre ADでのアプリの登録と設定が必要なのですが、そちらは次回記載予定です・・

using UnityEngine;
using Microsoft.Identity.Client;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
 
namespace AADSample
{
    public class SimpleADAuth : MonoBehaviour
    {
        private string clientId = "{AADに登録したアプリのclientID}";
        private string authority = "https://login.microsoftonline.com/{AADのテナントID}";
        private string[] scopes = new[] { "https://graph.microsoft.com/User.Read" };
 
        async void Start()
        {
            // AADにアクセスしてOAuthのトークンをもらう
            var token = await SignInUserAndGetTokenUsingMSAL();
            Debug.Log(token);
 
            // もらったトークンを使ってGraph APIにアクセスする
            string graphURI = "https://graph.microsoft.com/v1.0/me";
 
            var client = new HttpClient();
            var request = new HttpRequestMessage(HttpMethod.Get, graphURI);
            request.Headers.Add("Authorization", "Bearer " + token);
            var result = await client.SendAsync(request);
 
            Debug.Log(result);
        }
 
        public async Task<string> SignInUserAndGetTokenUsingMSAL()
        {
            var application = PublicClientApplicationBuilder.Create(clientId)
                                                    .WithAuthority(authority)
                                                    .WithRedirectUri("http://localhost")
                                                    .Build();
 
            AuthenticationResult result;
            try
            {
                var accounts = await application.GetAccountsAsync();
                result = await application.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
                 .ExecuteAsync();
            }
            catch (MsalUiRequiredException ex)
            {
                result = await application.AcquireTokenInteractive(scopes)
                 .WithClaims(ex.Claims)
                 .WithUseEmbeddedWebView(false)
                 .ExecuteAsync();
            }
 
            return result.AccessToken;
            // return result.IdToken; // OpenID Connectの場合はこちらを使う
        }
    }
}
スポンサーリンク

シェアする

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

フォローする

スポンサーリンク