ARCore云锚点无密钥认证问题求助(iOS+Unity环境)
ARCore Cloud Anchors OAuth2 授权失败问题解决
核心问题:用错了令牌类型
你混淆的几种令牌区别及正确用法:
- ID Token:仅用于身份验证(确认请求发起者身份),不具备API访问权限,ARCore Cloud Anchors API不接受这种令牌,这是你返回
ErrorNotAuthorized的直接原因。 - Access Token:专门用于授权访问指定API资源,ARCore Cloud Anchors要求使用这种令牌作为Bearer凭证。
- Bearer Token:是令牌的传输格式,指请求头中
Authorization: Bearer <token>里的<token>部分,这里的token必须是Access Token。
正确解决步骤
1. 获取ARCore专用的Access Token
必须基于服务账号JSON生成带有ARCore权限的Access Token,权限范围(scope)必须是https://www.googleapis.com/auth/arcore.cloudanchors。
Unity内生成示例(使用Google.Apis.Auth库)
先在Unity Package Manager中导入Google.Apis.Auth包,然后编写代码:
using Google.Apis.Auth.OAuth2; using System.Threading.Tasks; using UnityEngine; public class ARCoreAuthHandler : MonoBehaviour { [SerializeField] private TextAsset serviceAccountJson; // 把服务账号JSON文件拖到这里 public async Task<string> FetchARCoreAccessToken() { var credential = GoogleCredential.FromJson(serviceAccountJson.text) .CreateScoped(new[] { "https://www.googleapis.com/auth/arcore.cloudanchors" }); return await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(); } }
2. 正确设置令牌并托管锚点
拿到Access Token后,直接传入SetAuthToken(不需要加Bearer前缀,SDK会自动处理):
// 先获取令牌 var authHandler = GetComponent<ARCoreAuthHandler>(); var accessToken = await authHandler.FetchARCoreAccessToken(); // 设置认证令牌 ArCloudAnchorManager.Instance.SetAuthToken(accessToken); // 执行托管操作 var targetAnchor = ...; // 你的ARAnchor实例 var hostOp = ArCloudAnchorManager.Instance.HostCloudAnchorAsync(targetAnchor); await hostOp; if (hostOp.Status == CloudAnchorOperationStatus.Success) { Debug.Log($"锚点托管成功,ID: {hostOp.CloudAnchorId}"); } else { Debug.LogError($"托管失败: {hostOp.Status}"); }
3. 额外排查点
- 确认服务账号已在Google开发者控制台的IAM页面被授予ARCore Cloud Anchor Host或ARCore Cloud Anchor Manager角色。
- 检查ARCore API已在开发者控制台的API库中启用。
- 注意:客户端直接嵌入服务账号JSON有安全风险,建议后端服务器生成Access Token,客户端通过接口请求获取后再使用。
内容的提问来源于stack exchange,提问作者FlyingPolska
相关产品推荐
相关产品推荐

