XR_ANDROID_google_cloud_auth
Cadena de nombre
XR_ANDROID_google_cloud_auth
Tipo de extensión
Extensión de la instancia
Número de extensión registrado
788
Revisión
1
Estado de ratificación
No se ratificó
Dependencias de extensiones y versiones
XR_EXT_future
Fecha de la última modificación
2025-12-18
Estado de la IP
No hay reclamos conocidos por IP.
Colaboradores
John Ullman, Google
Ben King, Google
Nihav Jain, Google
Jared Finder, Google
Descripción general
Esta extensión permite el uso de extensiones basadas en Google Cloud, ya que permite que la aplicación proporcione credenciales de autenticación para las APIs de Cloud de Google. El desarrollador debe usar la consola de Google Cloud ( https://console.cloud.google.com/ ) para crear un proyecto de Google Cloud para la aplicación. Esta extensión requiere la extensión XR_EXT_future .
Durante el desarrollo, la aplicación puede depurar problemas con su configuración de Google Cloud usando la extensión XR_EXT_debug_utils . Si la aplicación tiene un Debug Messenger y se produce un error potencialmente procesable en el tiempo de ejecución cuando se envía una solicitud a Google Cloud en nombre de la aplicación, el tiempo de ejecución invoca la devolución de llamada del mensajero con un mensaje de error. En este caso, el desarrollador debe consultar el mensaje de error y toda la documentación disponible, y, luego, asegurarse de que la aplicación y el proyecto de Google Cloud estén configurados correctamente para usar las APIs de Cloud. El tiempo de ejecución debe usar el tipo de mensaje XR_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, la gravedad XR_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT y el messageId “GoogleCloudError”.
Autenticación
La estructura XrGoogleCloudAuthInfoBaseHeaderANDROID se define de la siguiente manera:
typedef struct XrGoogleCloudAuthInfoBaseHeaderANDROID {
XrStructureType type;
const void* next;
} XrGoogleCloudAuthInfoBaseHeaderANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.
Esta estructura no se usa directamente en la API, sino que se extiende con otras estructuras que se pueden usar con xrSetGoogleCloudAuthAsyncANDROID para proporcionar credenciales de autenticación.
Uso válido (implícito)
- La extensión
XR_ANDROID_google_cloud_authdebe habilitarse antes de usar XrGoogleCloudAuthInfoBaseHeaderANDROID -
typedebe ser uno de los siguientes valores de 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 -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras . Consulta también: XrGoogleCloudAuthErrorResultANDROID
La estructura XrGoogleCloudAuthInfoApiKeyANDROID se define de la siguiente manera:
typedef struct XrGoogleCloudAuthInfoApiKeyANDROID {
XrStructureType type;
const void* next;
const char* apiKey;
} XrGoogleCloudAuthInfoApiKeyANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.apiKeyes un puntero a una cadena que representa la clave de API.
Cuando esta estructura se pasa a xrSetGoogleCloudAuthAsyncANDROID , el miembro apiKey debe ser una cadena ASCII no vacía sin espacios ni caracteres de control; de lo contrario, el tiempo de ejecución debe devolver XR_ERROR_VALIDATION_FAILURE .
apiKey debe cumplir con las siguientes condiciones:
- Debe ser una clave de API válida generada para tu proyecto de Google Cloud.
- Tu proyecto de Google Cloud debe habilitar las APIs de Cloud pertinentes (especificadas por las extensiones dependientes).
- Si la clave de API tiene restricciones, estas deben permitir las APIs de Cloud de Google y tu aplicación.
De lo contrario, la llamada a xrSetGoogleCloudAuthAsyncANDROID se realizará correctamente, pero todas las llamadas a funciones que dependan de la autorización en la nube se comportarán como se documenta para las fallas en la nube en la extensión que define esas funciones. Si una función puede informar una falla y la aplicación encadena XrGoogleCloudAuthErrorResultANDROID al parámetro de salida de esa función, el tiempo de ejecución debe establecer XrGoogleCloudAuthErrorResultANDROID :: error en XR_GOOGLE_CLOUD_AUTH_ERROR_ANDROID para indicar este error.
La operación asíncrona se completará con XR_SUCCESS una vez que el entorno de ejecución valide el formato de la clave de API y la almacene.
Uso válido (implícito)
- La extensión
XR_ANDROID_google_cloud_authdebe habilitarse antes de usar XrGoogleCloudAuthInfoApiKeyANDROID -
typedebe serXR_TYPE_GOOGLE_CLOUD_AUTH_INFO_API_KEY_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
apiKeydebe ser una cadena UTF-8 terminada en nulo
La estructura XrGoogleCloudAuthInfoTokenANDROID se define de la siguiente manera:
typedef struct XrGoogleCloudAuthInfoTokenANDROID {
XrStructureType type;
const void* next;
const char* authToken;
} XrGoogleCloudAuthInfoTokenANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.authTokenes un puntero a una cadena que representa el token de autorización.
Cuando esta estructura se pasa a xrSetGoogleCloudAuthAsyncANDROID , el miembro authToken debe ser una cadena ASCII no vacía sin espacios ni caracteres de control; de lo contrario, el tiempo de ejecución debe devolver XR_ERROR_VALIDATION_FAILURE . authToken debe cumplir con las siguientes condiciones:
- Debe ser una credencial válida y no vencida generada para tu proyecto de Google Cloud.
- Tu proyecto de Google Cloud debe habilitar las APIs de Cloud pertinentes (especificadas por las extensiones dependientes).
La credencial debe ser una de las siguientes:
- Un token de acceso de OAuth2 con los alcances pertinentes, generado cuando se accede a una Cuenta de Google con tu aplicación
- Es un token de JWT firmado con los reclamos pertinentes, generado por una cuenta de servicio de tu proyecto de Google Cloud.
Los requisitos en cada caso se especifican en las extensiones dependientes. De lo contrario, la llamada a xrSetGoogleCloudAuthAsyncANDROID se realizará correctamente, pero todas las llamadas a funciones que dependan de la autorización en la nube se comportarán como se documenta para las fallas en la nube en la extensión que define esas funciones. Si una función puede informar una falla y la aplicación encadena XrGoogleCloudAuthErrorResultANDROID al parámetro de salida de esa función, el tiempo de ejecución debe establecer XrGoogleCloudAuthErrorResultANDROID :: error en XR_GOOGLE_CLOUD_AUTH_ERROR_ANDROID para indicar este error.
La aplicación debe pasar de forma proactiva un token nuevo a través de xrSetGoogleCloudAuthAsyncANDROID antes de que caduque el token anterior. El tiempo de ejecución debe usar el token más reciente que pasó la aplicación cuando se inicia una nueva solicitud de red.
La operación asíncrona se completará con XR_SUCCESS una vez que el tiempo de ejecución valide el formato del token y lo almacene.
Uso válido (implícito)
- La extensión
XR_ANDROID_google_cloud_authdebe habilitarse antes de usar XrGoogleCloudAuthInfoTokenANDROID -
typedebe serXR_TYPE_GOOGLE_CLOUD_AUTH_INFO_TOKEN_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
authTokendebe ser una cadena UTF-8 terminada en nulo
La estructura XrGoogleCloudAuthInfoKeylessANDROID se define de la siguiente manera:
typedef struct XrGoogleCloudAuthInfoKeylessANDROID {
XrStructureType type;
const void* next;
} XrGoogleCloudAuthInfoKeylessANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.
Cuando esta estructura se pasa a xrSetGoogleCloudAuthAsyncANDROID, el tiempo de ejecución puede generar credenciales de forma dinámica (p.ej., en Android, el tiempo de ejecución se comunica con los Servicios de Google Play desde el proceso de la aplicación). Si la autenticación sin llave no está configurada correctamente, es posible que el tiempo de ejecución devuelva XR_ERROR_KEYLESS_AUTH_NOT_SETUP_ANDROID de forma síncrona.
La operación asíncrona realizará las solicitudes de red necesarias para recuperar las credenciales. El resultado de esta operación se devolverá en XrFutureCompletionEXT :: futureResult desde xrSetGoogleCloudAuthCompleteANDROID . Si el resultado futuro es XR_SUCCESS , las credenciales de autenticación sin clave se aplicaron correctamente. Si el resultado futuro es XR_ERROR_KEYLESS_AUTH_FAILED_ANDROID , la aplicación puede volver a intentarlo más tarde.
Uso válido (implícito)
- La extensión
XR_ANDROID_google_cloud_authdebe habilitarse antes de usar XrGoogleCloudAuthInfoKeylessANDROID -
typedebe serXR_TYPE_GOOGLE_CLOUD_AUTH_INFO_KEYLESS_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras
La función xrSetGoogleCloudAuthAsyncANDROID se define de la siguiente manera:
XrResult xrSetGoogleCloudAuthAsyncANDROID(
XrSession session,
const XrGoogleCloudAuthInfoBaseHeaderANDROID* authInfo,
XrFutureEXT* future);
Descripciones de los parámetros
sessiones el XrSession que usará las credenciales.authInfoes un puntero a un struct que especifica el método y los parámetros de autenticación, con su campo XrGoogleCloudAuthInfoBaseHeaderANDROID ::typeque indica el struct específico.futurees un puntero a un identificador deXrFutureEXTen el que se devuelve el futuro creado, o XR_NULL_HANDLE si la función no devolvióXR_SUCCESS.
Establece las credenciales que se usan para la autenticación con Google Cloud. Esta operación es asíncrona. Llama a xrPollFutureEXT para verificar el estado de preparación en el futuro. Una vez que el futuro esté en el estado listo, llama a xrSetGoogleCloudAuthCompleteANDROID para recuperar el resultado.
El parámetro authInfo debe ser un puntero a una estructura cuyo miembro XrGoogleCloudAuthInfoBaseHeaderANDROID :: type identifica el método de autenticación que se usará y que extiende XrGoogleCloudAuthInfoBaseHeaderANDROID (p.ej., XrGoogleCloudAuthInfoApiKeyANDROID).
Los requisitos, los comportamientos y las condiciones de error específicos (tanto síncronos como asíncronos) para cada método de autenticación se describen en la documentación de sus respectivos structs de datos.
Uso válido (implícito)
- La extensión
XR_ANDROID_google_cloud_authdebe habilitarse antes de llamar a xrSetGoogleCloudAuthAsyncANDROID -
sessiondebe ser un identificador de XrSession válido -
authInfodebe ser un puntero a una estructura válida basada en XrGoogleCloudAuthInfoBaseHeaderANDROID. También consulta: XrGoogleCloudAuthInfoApiKeyANDROID, XrGoogleCloudAuthInfoKeylessANDROID y XrGoogleCloudAuthInfoTokenANDROID. -
futuredebe ser un puntero a un valorXrFutureEXT.
Códigos de retorno
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
La función xrSetGoogleCloudAuthCompleteANDROID se define de la siguiente manera:
XrResult xrSetGoogleCloudAuthCompleteANDROID(
XrSession session,
XrFutureEXT future,
XrFutureCompletionEXT* completion);
Descripciones de los parámetros
sessiones el XrSession que se usa para iniciar la operación.futurees elXrFutureEXTque se debe completar.completiones un puntero a un XrFutureCompletionEXT que completa el tiempo de ejecución.
Códigos de devolución futuros
XrFutureCompletionEXT :: Valores de futureResult:
XR_SUCCESS: Las credenciales se aplicaron correctamente.
XR_ERROR_KEYLESS_AUTH_FAILED_ANDROID: Falló la autenticación sin llave. La aplicación puede volver a intentarlo más tarde. La aplicación o el desarrollador también pueden verificar ciertas condiciones previas para el éxito (p.ej., en Android, el dispositivo debe tener una instalación actualizada de los Servicios de Google Play y estos servicios deben funcionar correctamente).
Uso válido (implícito)
- La extensión
XR_ANDROID_google_cloud_authdebe habilitarse antes de llamar a xrSetGoogleCloudAuthCompleteANDROID -
sessiondebe ser un identificador de XrSession válido -
completiondebe ser un puntero a una estructura XrFutureCompletionEXT.
Códigos de retorno
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
Errores de autenticación de Google Cloud
La enumeración XrGoogleCloudAuthErrorANDROID se define de la siguiente manera:
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;
Los enumerantes tienen los siguientes valores:
Descripción de la enumeración
XR_GOOGLE_CLOUD_AUTH_ERROR_NONE_ANDROID
No se produjo ningún error al invocar una API de Google Cloud.
XR_GOOGLE_CLOUD_AUTH_ERROR_QUOTA_EXCEEDED_ANDROID
Se excedió la cuota cuando se invocó una API de Google Cloud.
XR_GOOGLE_CLOUD_AUTH_ERROR_UNREACHABLE_ANDROID
No se pudo acceder a una API de Google Cloud, posiblemente debido a problemas de conectividad de red o disponibilidad del servidor.
XR_GOOGLE_CLOUD_AUTH_ERROR_ANDROID
Se produjo un error de autenticación cuando se invocó una API de Google Cloud.
La estructura XrGoogleCloudAuthErrorResultANDROID se define de la siguiente manera:
typedef struct XrGoogleCloudAuthErrorResultANDROID {
XrStructureType type;
void* next;
XrGoogleCloudAuthErrorANDROID error;
} XrGoogleCloudAuthErrorResultANDROID;
Descripciones de los miembros
typees el XrStructureType de esta estructura.nextesNULLo un puntero a la siguiente estructura en una cadena de estructuras.errores el XrGoogleCloudAuthErrorANDROID que detalla la causa del error de una operación que accede a Google Cloud.
Si una operación falla debido a la autenticación de Google Cloud, esta estructura puede encadenarse a la estructura de resultado operativo para proporcionar más información sobre el error.
Uso válido (implícito)
- La extensión
XR_ANDROID_google_cloud_authdebe habilitarse antes de usar XrGoogleCloudAuthErrorResultANDROID -
typedebe serXR_TYPE_GOOGLE_CLOUD_AUTH_ERROR_RESULT_ANDROID -
nextdebe serNULLo un puntero válido a la siguiente estructura en una cadena de estructuras -
errordebe ser un valor de XrGoogleCloudAuthErrorANDROID válido
Ejemplo de código
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.
}
}
Comandos nuevos
Nuevas estructuras
- XrGoogleCloudAuthInfoApiKeyANDROID
- XrGoogleCloudAuthInfoBaseHeaderANDROID
- XrGoogleCloudAuthInfoKeylessANDROID
- XrGoogleCloudAuthInfoTokenANDROID
Extensión de XrGoogleCloudAuthInfoBaseHeaderANDROID :
Nuevas enumeraciones
Nuevas constantes de enumeración
XR_ANDROID_GOOGLE_CLOUD_AUTH_EXTENSION_NAMEXR_ANDROID_google_cloud_auth_SPEC_VERSIONExtensión de XrResult :
XR_ERROR_KEYLESS_AUTH_FAILED_ANDROIDXR_ERROR_KEYLESS_AUTH_NOT_SETUP_ANDROID
Extensión de 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
Problemas
Revisión 1, 2025-12-18 (Ben King)
- Es la descripción inicial de la extensión.