XR_ANDROID_google_cloud_auth
名称字符串
XR_ANDROID_google_cloud_auth
扩展程序类型
实例扩展程序
已注册的扩展程序编号
788
修订版本
1
批准状态
未批准
扩展程序和版本依赖项
XR_EXT_future
上次修改日期
2025-12-18
IP 状态
没有已知的 IP 权利主张。
创作贡献者
John Ullman,Google
Ben King,Google
Nihav Jain,Google
Jared Finder,Google
概览
此扩展程序允许应用为 Google Cloud API 提供身份验证凭据,从而使用基于 Google Cloud 的扩展程序。开发者必须 使用 Google Cloud 控制台 ( https://console.cloud.google.com/ ) 为应用创建 Google Cloud 项目。此扩展程序需要扩展程序 XR_EXT_future。
在开发期间,应用可以 使用扩展程序 XR_EXT_debug_utils 调试 Google Cloud 设置方面的问题。如果应用有调试消息传递器,并且在运行时代表应用向 Google Cloud 发送请求时发生可能需要采取措施的错误,则运行时会使用错误消息调用消息传递器的回调。在这种情况下,开发者应 查阅出错提示和所有可用文档,然后确保应用和 Google Cloud 云项目已正确设置为使用 Google Cloud API。运行时必须 使用消息类型 XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT、严重级别 XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT 和 messageId“GoogleCloudError”。
身份验证
XrGoogleCloudAuthInfoBaseHeaderANDROID 结构的定义如下:
typedef struct XrGoogleCloudAuthInfoBaseHeaderANDROID {
XrStructureType type;
const void* next;
} XrGoogleCloudAuthInfoBaseHeaderANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。
此结构不会直接在 API 中使用,但会被其他结构扩展,这些结构可以 与 xrSetGoogleCloudAuthAsyncANDROID 搭配使用,以提供身份验证凭据。
有效用法(隐式)
- 必须先启用
XR_ANDROID_google_cloud_auth扩展程序,然后才能使用 XrGoogleCloudAuthInfoBaseHeaderANDROID -
type必须 是以下 XrStructureType 值之一:XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_API_KEY_ANDROID、XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_KEYLESS_ANDROID、XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_TOKEN_ANDROID -
next必须 是NULL或指向结构链中下一个结构的有效指针。另请参阅:XrGoogleCloudAuthErrorResultANDROID
XrGoogleCloudAuthInfoApiKeyANDROID 结构的定义如下:
typedef struct XrGoogleCloudAuthInfoApiKeyANDROID {
XrStructureType type;
const void* next;
const char* apiKey;
} XrGoogleCloudAuthInfoApiKeyANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。apiKey是指向表示 API 密钥的字符串的指针。
当此结构传递给 xrSetGoogleCloudAuthAsyncANDROID 时,apiKey 成员 必须 是不包含空格或控制字符的非空 ASCII 字符串,否则运行时 必须 返回 XR_ERROR_VALIDATION_FAILURE。
apiKey 必须 进一步满足以下条件:
- 它必须 是为您的 Google Cloud 云项目生成的有效 API 密钥。
- 您的 Google Cloud 项目必须 启用相关的 Google Cloud API(由依赖的扩展程序指定)。
- 如果 API 密钥有限制,则这些限制必须 允许相关的 Google Cloud API 和您的应用。
否则,对 xrSetGoogleCloudAuthAsyncANDROID 的调用将成功,但对依赖于云授权的函数的所有调用都将按照定义这些函数的扩展程序中针对云故障的文档执行。如果函数 可以 报告故障,并且应用将 XrGoogleCloudAuthErrorResultANDROID 链接到该函数的输出参数,则运行时 必须 将 XrGoogleCloudAuthErrorResultANDROID :: error 设置为 XR_GOOGLE_CLOUD_AUTH_ERROR_ANDROID 以指示此错误。
异步操作将在运行时验证 API 密钥的格式并存储该密钥后,以 XR_SUCCESS 完成。
有效用法(隐式)
- 必须先启用
XR_ANDROID_google_cloud_auth扩展程序,然后才能使用 XrGoogleCloudAuthInfoApiKeyANDROID -
type必须 是XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_API_KEY_ANDROID -
next必须 是NULL或指向结构链中下一个结构的有效指针 -
apiKey必须 是以 null 结尾的 UTF-8 字符串
XrGoogleCloudAuthInfoTokenANDROID 结构的定义如下:
typedef struct XrGoogleCloudAuthInfoTokenANDROID {
XrStructureType type;
const void* next;
const char* authToken;
} XrGoogleCloudAuthInfoTokenANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。authToken是指向表示身份验证令牌的字符串的指针。
当此结构传递给 xrSetGoogleCloudAuthAsyncANDROID 时,authToken 成员 必须 是不包含空格或控制字符的非空 ASCII 字符串,否则运行时 必须 返回 XR_ERROR_VALIDATION_FAILURE。authToken 必须 进一步满足以下条件:
- 它必须 是为您的 Google Cloud 项目生成的有效且未过期的凭据。
- 您的 Google Cloud 项目必须 启用相关的 Google Cloud API(由依赖的扩展程序指定)。
凭据必须 是以下其中一项:
- 通过使用您的应用登录 Google 账号生成的具有相关范围的 OAuth2 访问令牌,或者
- 由 Google Cloud 项目中的服务账号生成的具有相关声明的已签名 JWT 令牌。
每种情况下的要求由依赖的扩展程序指定。否则,对 xrSetGoogleCloudAuthAsyncANDROID 的调用将成功,但对依赖于云授权的函数的所有调用都将按照定义这些函数的扩展程序中针对云故障的文档执行。如果函数 可以 报告故障,并且应用将 XrGoogleCloudAuthErrorResultANDROID 链接到该函数的输出参数,则运行时 必须 将 XrGoogleCloudAuthErrorResultANDROID :: error 设置为 XR_GOOGLE_CLOUD_AUTH_ERROR_ANDROID 以指示此错误。
应用必须 在旧令牌过期之前,通过 xrSetGoogleCloudAuthAsyncANDROID 主动传入新令牌。运行时必须 在启动新的网络请求时使用应用传入的最新令牌。
异步操作将在运行时验证令牌的格式并存储该令牌后,以 XR_SUCCESS 完成。
有效用法(隐式)
- 必须先启用
XR_ANDROID_google_cloud_auth扩展程序,然后才能使用 XrGoogleCloudAuthInfoTokenANDROID -
type必须 是XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_TOKEN_ANDROID -
next必须 是NULL或指向结构链中下一个结构的有效指针 -
authToken必须 是以 null 结尾的 UTF-8 字符串
XrGoogleCloudAuthInfoKeylessANDROID 结构的定义如下:
typedef struct XrGoogleCloudAuthInfoKeylessANDROID {
XrStructureType type;
const void* next;
} XrGoogleCloudAuthInfoKeylessANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。
当此结构传递给 xrSetGoogleCloudAuthAsyncANDROID 时,运行时 可以 动态生成凭据(例如,在 Android 上,运行时会从应用进程与 Google Play 服务通信)。如果无密钥身份验证设置不正确,运行时可以 同步返回 XR_ERROR_KEYLESS_AUTH_NOT_SETUP_ANDROID。
异步操作将执行必要的网络请求来提取凭据。此操作的结果将通过 XrFutureCompletionEXT :: futureResult 从 xrSetGoogleCloudAuthCompleteANDROID 返回。如果 future 结果为 XR_SUCCESS,则表示无密钥身份验证凭据已成功应用。如果 future 结果为 XR_ERROR_KEYLESS_AUTH_FAILED_ANDROID,则应用可以 稍后重试。
有效用法(隐式)
- 必须先启用
XR_ANDROID_google_cloud_auth扩展程序,然后才能使用 XrGoogleCloudAuthInfoKeylessANDROID必须 -
type必须 是XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_KEYLESS_ANDROID -
next必须 是NULL或指向结构链中下一个结构的有效指针
xrSetGoogleCloudAuthAsyncANDROID 函数的定义如下:
XrResult xrSetGoogleCloudAuthAsyncANDROID(
XrSession session,
const XrGoogleCloudAuthInfoBaseHeaderANDROID* authInfo,
XrFutureEXT* future);
参数说明
session是将使用凭据的 XrSession。authInfo是指向用于指定身份验证方法和参数的结构的指针,其 XrGoogleCloudAuthInfoBaseHeaderANDROID ::type字段用于指示特定结构。future是指向XrFutureEXT句柄的指针,创建的 future 将通过该句柄返回;如果函数未返回XR_SUCCESS,则返回 XR_NULL_HANDLE。
设置用于向 Google Cloud 进行身份验证的凭据。这是一项异步操作。调用 xrPollFutureEXT 以检查 future 的就绪状态。当 future 处于就绪状态时,调用 xrSetGoogleCloudAuthCompleteANDROID 以检索结果。
authInfo 参数 必须 是指向结构的指针,该结构的 XrGoogleCloudAuthInfoBaseHeaderANDROID :: type 成员用于标识要使用的身份验证方法,并且该结构扩展了 XrGoogleCloudAuthInfoBaseHeaderANDROID(例如 XrGoogleCloudAuthInfoApiKeyANDROID)。
每种身份验证方法的具体要求、行为和错误条件(同步和异步)在各自数据结构的文档中进行了说明。
有效用法(隐式)
- 必须先启用
XR_ANDROID_google_cloud_auth扩展程序,然后才能调用 xrSetGoogleCloudAuthAsyncANDROID -
session必须 是有效的 XrSession 句柄 -
authInfo必须 是指向基于 XrGoogleCloudAuthInfoBaseHeaderANDROID 的有效结构的指针。另请参阅:XrGoogleCloudAuthInfoApiKeyANDROID、XrGoogleCloudAuthInfoKeylessANDROID、XrGoogleCloudAuthInfoTokenANDROID -
future必须 是指向XrFutureEXT值的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_KEYLESS_AUTH_NOT_SETUP_ANDROIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
xrSetGoogleCloudAuthCompleteANDROID 函数的定义如下:
XrResult xrSetGoogleCloudAuthCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrFutureCompletionEXT* completion);
参数说明
session是用于启动操作的 XrSession。future是要完成的XrFutureEXT。completion是指向由运行时填充的 XrFutureCompletionEXT 的指针。
Future 返回代码
XrFutureCompletionEXT:: 值:futureResult
XR_SUCCESS:凭据已成功应用。
XR_ERROR_KEYLESS_AUTH_FAILED_ANDROID:无密钥身份验证失败。应用可以 稍后重试。应用或开发者可以 检查某些成功的前提条件(例如,在 Android 上,设备必须 安装最新版本的 Google Play 服务,并且这些服务必须 正常运行)。
有效用法(隐式)
- 必须先启用
XR_ANDROID_google_cloud_auth扩展程序,然后才能调用 xrSetGoogleCloudAuthCompleteANDROID -
session必须 是有效的 XrSession 句柄 -
completion必须 是指向 XrFutureCompletionEXT 结构的指针
返回代码
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_FUTURE_INVALID_EXTXR_ERROR_FUTURE_PENDING_EXTXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_VALIDATION_FAILURE
Google Cloud 身份验证错误
XrGoogleCloudAuthErrorANDROID 枚举的定义如下:
typedef enum XrGoogleCloudAuthErrorANDROID {
XR_GOOGLE_CLOUD_AUTH_ERROR_NONE_ANDROID = 0,
XR_GOOGLE_CLOUD_AUTH_ERROR_QUOTA_EXCEEDED_ANDROID = -1,
XR_GOOGLE_CLOUD_AUTH_ERROR_UNREACHABLE_ANDROID = -2,
XR_GOOGLE_CLOUD_AUTH_ERROR_ANDROID = -3,
XR_GOOGLE_CLOUD_AUTH_ERROR_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrGoogleCloudAuthErrorANDROID;
枚举数具有以下值:
枚举说明
XR_GOOGLE_CLOUD_AUTH_ERROR_NONE_ANDROID
调用 Google Cloud API 时未发生任何错误。
XR_GOOGLE_CLOUD_AUTH_ERROR_QUOTA_EXCEEDED_ANDROID
调用 Google Cloud API 时超出配额。
XR_GOOGLE_CLOUD_AUTH_ERROR_UNREACHABLE_ANDROID
无法访问 Google Cloud API,可能是由于网络连接问题或服务器可用性问题。
XR_GOOGLE_CLOUD_AUTH_ERROR_ANDROID
调用 Google Cloud API 时发生身份验证错误。
XrGoogleCloudAuthErrorResultANDROID 结构的定义如下:
typedef struct XrGoogleCloudAuthErrorResultANDROID {
XrStructureType type;
void* next;
XrGoogleCloudAuthErrorANDROID error;
} XrGoogleCloudAuthErrorResultANDROID;
成员说明
type是此结构的 XrStructureType。next是NULL或指向结构链中下一个结构的指针。error是 XrGoogleCloudAuthErrorANDROID,详细说明了访问 Google Cloud 的操作发生错误的原因。
如果操作因 Google Cloud 身份验证而失败,则此结构体可以 链接到操作结果结构体,以提供有关错误的更多信息。
有效用法(隐式)
- 必须先启用
XR_ANDROID_google_cloud_auth扩展程序,然后才能使用 XrGoogleCloudAuthErrorResultANDROID -
type必须 是XR_TYPE_GOOGLE_CLOUD_AUTH_ERROR_RESULT_ANDROID -
next必须 是NULL或指向结构链中下一个结构的有效指针 -
error必须 是有效的 XrGoogleCloudAuthErrorANDROID 值
示例代码
XrSession session; // previously initialized
XrInstance instance; // previously initialized
XrFutureEXT future = XR_NULL_HANDLE;
// The function pointers are previously initialized using
// xrGetInstanceProcAddr.
PFN_xrPollFutureEXT xrPollFutureEXT; // previously initialized
PFN_xrSetGoogleCloudAuthAsyncANDROID xrSetGoogleCloudAuthAsyncANDROID; // previously initialized
PFN_xrSetGoogleCloudAuthCompleteANDROID xrSetGoogleCloudAuthCompleteANDROID; // previously initialized
auto waitUntilReady = [&](XrFutureEXT future) {
XrFuturePollInfoEXT pollInfo{XR_TYPE_FUTURE_POLL_INFO_EXT};
XrFuturePollResultEXT pollResult{XR_TYPE_FUTURE_POLL_RESULT_EXT};
pollInfo.future = future;
do {
// sleep(1);
xrPollFutureEXT(instance, &pollInfo, &pollResult);
} while (pollResult.state != XR_FUTURE_STATE_READY_EXT);
};
// Set Google Cloud auth via API key.
XrGoogleCloudAuthInfoApiKeyANDROID authApiKey{XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_API_KEY_ANDROID};
authApiKey.apiKey = "MYAPIKEY";
XrResult result = xrSetGoogleCloudAuthAsyncANDROID(
session, reinterpret_cast<XrGoogleCloudAuthInfoBaseHeaderANDROID*>(&authApiKey), &future);
// Or, set Google Cloud auth via auth token:
XrGoogleCloudAuthInfoTokenANDROID authToken{XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_TOKEN_ANDROID};
authToken.authToken = "MYAUTHTOKEN";
result = xrSetGoogleCloudAuthAsyncANDROID(
session, reinterpret_cast<XrGoogleCloudAuthInfoBaseHeaderANDROID*>(&authToken), &future);
// Or, set Google Cloud auth via keyless auth:
XrGoogleCloudAuthInfoKeylessANDROID authKeyless{XR_TYPE_GOOGLE_CLOUD_AUTH_INFO_KEYLESS_ANDROID};
result = xrSetGoogleCloudAuthAsyncANDROID(
session, reinterpret_cast<XrGoogleCloudAuthInfoBaseHeaderANDROID*>(&authKeyless),
&future);
// Check the result of the auth setup.
if (result == XR_ERROR_VALIDATION_FAILURE) {
// The credentials were invalid.
} else if (result == XR_ERROR_KEYLESS_AUTH_NOT_SETUP_ANDROID) {
// Keyless auth was not properly setup.
} else if (result == XR_SUCCESS) {
waitUntilReady(future);
XrFutureCompletionEXT completion{XR_TYPE_FUTURE_COMPLETION_EXT};
xrSetGoogleCloudAuthCompleteANDROID(session, future, &completion);
if (completion.futureResult == XR_SUCCESS) {
// Credentials were successfully applied.
} else if (completion.futureResult == XR_ERROR_KEYLESS_AUTH_FAILED_ANDROID) {
// An error occurred when setting keyless auth credentials. This error may be retried.
}
}
新命令
新结构
- XrGoogleCloudAuthInfoApiKeyANDROID
- XrGoogleCloudAuthInfoBaseHeaderANDROID
- XrGoogleCloudAuthInfoKeylessANDROID
- XrGoogleCloudAuthInfoTokenANDROID
新枚举
新枚举常量
XR_ANDROID_GOOGLE_CLOUD_AUTH_EXTENSION_NAMEXR_ANDROID_google_cloud_auth_SPEC_VERSION扩展 XrResult:
XR_ERROR_KEYLESS_AUTH_FAILED_ANDROIDXR_ERROR_KEYLESS_AUTH_NOT_SETUP_ANDROID
扩展 XrStructureType:
XR_TYPE_GOOGLE_CLOUD_AUTH_ERROR_RESULT_ANDROIDXR_TYPE_GOOGLE_CLOUD_AUTH_INFO_API_KEY_ANDROIDXR_TYPE_GOOGLE_CLOUD_AUTH_INFO_KEYLESS_ANDROIDXR_TYPE_GOOGLE_CLOUD_AUTH_INFO_TOKEN_ANDROID
问题
修订版 1,2025-12-18 (Ben King)
- 初始扩展程序说明。