Unity中如何像Minecraft基岩版那样获取玩家Microsoft用户名
Unity 对接微软账号获取登录用户名实现方案
要实现类似Minecraft基岩版拉取微软账号用户名作为游戏内昵称的效果,直接走微软官方身份认证流程即可,步骤如下:
前置配置
- 登录微软Azure后台,在Azure Active Directory中注册新的应用注册项,记录生成的
Client ID - 给注册的应用添加
User.Read委托权限,该权限用于读取登录用户的公开基础资料 - 根据你发布的目标平台配置重定向地址:PC单机平台填
http://localhost:8080即可,UWP、主机等平台按照微软官方对应平台的重定向规则填写 - 下载适配Unity所用.NET版本的MSAL(Microsoft Authentication Library)库dll,放入项目
Assets/Plugins目录下
注意:MSAL库版本要匹配Unity项目的.NET兼容等级,Unity 2021及以上版本推荐选择适配.NET Standard 2.1的库版本,否则会出现dll加载失败的报错
核心代码实现
核心逻辑是拉起浏览器让用户完成微软账号登录授权,拿到访问令牌后调用微软Graph接口拉取用户信息,示例代码如下:
using Microsoft.Identity.Client; using System; using System.Linq; using System.Threading.Tasks; using UnityEngine; public class MicrosoftAuthManager : MonoBehaviour { private static IPublicClientApplication _clientApp; // 替换为你前面拿到的Azure应用Client ID private static string _clientId = "你的Azure应用Client ID"; // 读取用户基础资料所需的权限范围 private static string[] _scopes = new[] { "User.Read" }; private async void Start() { _clientApp = PublicClientApplicationBuilder.Create(_clientId) .WithRedirectUri("http://localhost:8080") .Build(); string playerName = await LoginAndGetUserName(); Debug.Log($"当前登录玩家用户名:{playerName}"); // 此处将playerName赋值给游戏内玩家名显示组件即可 } private async Task<string> LoginAndGetUserName() { AuthenticationResult authResult = null; // 优先查找本地缓存的登录凭证,存在就静默登录,不需要重复弹授权页 var accounts = await _clientApp.GetAccountsAsync(); try { authResult = await _clientApp.AcquireTokenSilent(_scopes, accounts.FirstOrDefault()) .ExecuteAsync(); } catch (MsalUiRequiredException) { // 缓存失效或者首次登录,弹出系统浏览器走账号密码授权流程 authResult = await _clientApp.AcquireTokenInteractive(_scopes) .ExecuteAsync(); } // 拿到有效令牌后调用Graph接口拉取用户公开资料 var httpClient = new System.Net.Http.HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", authResult.AccessToken); var response = await httpClient.GetAsync("https://graph.microsoft.com/v1.0/me"); if (response.IsSuccessStatusCode) { var userData = JsonUtility.FromJson<MicrosoftUserData>(await response.Content.ReadAsStringAsync()); // displayName就是用户微软账号对外显示的用户名 return userData.displayName; } // 拉取失败时返回兜底默认名 return "玩家" + UnityEngine.Random.Range(1000, 9999); } [Serializable] private class MicrosoftUserData { public string displayName; } }
补充说明
- 如果你要和Minecraft基岩版完全一致显示Xbox玩家代号(Gamertag)而不是微软账号本身的显示名,需要在拿到微软token后额外走Xbox Live服务的授权流程,再调用Xbox Profile接口拉取对应玩家代号即可
- 登录凭证会自动存在本地,下次启动不需要重复让用户输入账号密码,直接走静默拉取token的流程即可
- 不同发布平台需要对应配置权限:比如UWP平台需要在清单文件中开启网络、企业认证权限,WebGL平台需要配置对应平台的弹窗授权逻辑

内容的提问来源于stack exchange,提问作者1WeirdDev
相关产品推荐
相关产品推荐

