在 iOS 应用中使用 Unity 中的 Microsoft 身份验证库 (MSAL) 进行单点登录

Using Microsoft Authentication Library (MSAL) in Unity for SSO in iOS app

我们为公司开发了一系列增强现实应用程序。这些应用程序基于游戏引擎 Unity(当前版本为 2020.3.7f1)。现在,我们面临的问题是我们希望在我们的应用程序中实施 SSO 方法,因此我们公司的每个成员都使用他的公司用户凭据对自己进行身份验证。要对我们想要/必须使用 Microsoft 身份平台和 Microsoft 身份验证库 (MSAL) 的用户进行身份验证。

我们已经在 Azure 上创建了一个客户端,其中包含客户端 ID、重定向 uri、权限 uri、端点、租户等,并且已通过 Microsoft (https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-ios) 的官方示例项目成功测试。

但是现在我们停留在了在Unity中建立这个过程的点上。我们创建了 MSAL 库 dll (https://github.com/AzureAD/microsoft-authentication-library-for-dotnet),将其导入 Unity 并使用命名空间 Microsoft.Identity.Client 调用它。 由于安全原因,我们只被允许使用 PublicClientApplicationBuilder(这完全有道理),所以我们需要基于 Web 的登录屏幕。问题是我们无法在 Unity 中实现 Web 视图,用户可以在其中登录 Microsoft,并且我们可以将收到的令牌从 Web 视图中解析到我们的应用程序中以进行进一步通信。

我们进行了大量互联网研究以找到解决方案,但只有一些关于 Unity 中的 MSAL 的帖子结合 Android 和其他引用我之前提到的 git 存储库的帖子.

我们如何在 iOS 设备上使用 Unity 中的 MSAL?

示例代码:

 IPublicClientApplication PublicClientApp = PublicClientApplicationBuilder
        .Create(kClientID)
        .WithRedirectUri(kRedirectUri)
        .WithAuthority(new Uri(kAuthority))
        .Build();
 IEnumerable<string> scopes = new List<string> { "https://graph.microsoft.com/.default" };
 AuthenticationResult result;
 result = await PublicClientApp.AcquireTokenInteractive(scopes)
                   .ExecuteAsync();

 result = await PublicClientApp
        .AcquireTokenInteractive(scopes)
        .WithParentActivityOrWindow(new object)
        .ExecuteAsync();

 Debug.Log(result.AccessToken);

移动设备的标准解决方案是 AppAuth 模式,它涉及使用集成系统浏览器让用户登录。请参阅 this code example article 了解它的外观,以便您了解所需的行为。

所以看起来他们与 iOS 相关的关键是避免通过 webview 登录并告诉 MSAL 使用 ASWebAuthenticationSession window - this Microsoft article 解释了如何。

我们使用以下资产来做到这一点: UnitySafariViewController

在Unity外打开SafariViewController,支持包含授权码的回调。收到授权码后,其他所有事情(请求令牌等)都可以通过 Unity WebRequest 完成。 请记住将 iOS 上经纪人的 redirect uri 添加到 Info.plist.

最重要link: The auth flow

您可以将 Microsoft 标识平台 OAuth 2.0 与设备登录一起使用。它设计用于 input-constrained 应用程序(如 Unity 应用程序)和设备。 Here 你可以找到它的文档。

例如AltspaceVR(一个 Unity 应用程序)正在其 Mac 和 Quest2 版本中使用它。