なんと前回の投稿から1年近く経ってしまいました。
UnityからAD認証をするには、まずNuGetまたは手動でMicrosoft.Identity.ClientのDLLを取得しよう、という話でした。
ここでそもそも論に立ち返りますが、Azure Active Directoryでの「認証」とは何か、という話になります。
公式ドキュメントには、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のフローは下記ページでわかりやすく解説されています。
そういう観点で、以前の投稿で参考にすると紹介した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の場合はこちらを使う } } }