Algunos servicios de Google, como Drive, Gmail y muchos otros, proporcionan APIs públicas que puedes usar para crear apps que ayuden a los usuarios a trabajar con sus datos en estos servicios. Para acceder a estos servicios, las apps deben implementar uno de los flujos de cliente de OAuth 2.0 para obtener el consentimiento de los usuarios y los tokens de acceso, que otorgan acceso a las APIs.
Puedes usar la biblioteca de Acceso con Google, que implementa el flujo de OAuth 2.0 por ti, para obtener tokens de acceso del usuario que accedió.
Requisitos previos
Antes de que tu app para iOS pueda llamar a las APIs de Google, completa los siguientes pasos de configuración:
1. Habilita las API para tu proyecto.
Cualquier aplicación que llame a las APIs de Google debe habilitarlas en la consola de Google Cloud.
Para habilitar una API en tu proyecto, sigue estos pasos:
- Abre la Biblioteca de APIs en la consola de Google Cloud.
- Si se te solicita, selecciona un proyecto o crea uno nuevo.
- Selecciona la API que deseas habilitar y, luego, haz clic en Habilitar.
2. Crea credenciales de autorización
Cualquier aplicación para iOS que use OAuth 2.0 para acceder a las APIs de Google debe tener credenciales de autorización que identifiquen la aplicación ante el servidor de autorización de Google. En los siguientes pasos, se explica cómo crear credenciales para tu proyecto:
- Ve a la página Credenciales en la consola de Google Cloud.
- Haz clic en Crear cliente (o Crear credenciales > ID de cliente de OAuth).
- Selecciona el tipo de aplicación iOS.
- Ingresa un nombre para el cliente de OAuth. Este nombre identifica al cliente en la página Credenciales de tu proyecto.
- Ingresa el identificador de paquete de tu app. El ID del paquete es el valor de
la clave
CFBundleIdentifieren el archivoInfo.plistde tu app. Por lo general, el valor se muestra en el panel General o en el panel Signing & Capabilities del editor de proyectos de Xcode, o en la página App Information de App Store Connect de Apple. Confirma que uses el ID del paquete correcto, ya que no se puede cambiar si usas la Verificación de aplicaciones. - (Opcional) Ingresa el ID de App Store de tu app si está publicada en la App Store de Apple. El ID de la tienda es una cadena numérica que se incluye en todas las URLs de la tienda de aplicaciones de Apple.
- Ingresa tu ID de equipo (opcional). Consulta Ubica tu ID de equipo en la documentación de la cuenta de desarrollador de Apple. El ID de equipo es obligatorio si habilitas la Verificación de aplicaciones para tu cliente.
- (Opcional) Habilita la Verificación de aplicaciones para tu app para iOS. Cuando habilitas la Verificación de aplicaciones, se usa el servicio App Attest de Apple para verificar que las solicitudes de OAuth 2.0 que se originan en tu cliente de OAuth sean genuinas y provengan de tu app, lo que ayuda a reducir el riesgo de robo de identidad de la app.
- Haz clic en Crear.
Tu ID de cliente se genera y se muestra en la consola de Google Cloud. Agrega el
esquema de URL del ID de cliente invertido (por ejemplo,
com.googleusercontent.apps.1234567890-abcdef) al archivo Info.plist de tu app para
controlar los redireccionamientos de autorización.
3. Cómo completar la integración básica del Acceso con Google
Completa la integración básica de Acceso con Google antes de solicitar permisos incrementales y llamar a las APIs de Google.
1. Verifica qué permisos se otorgaron
Antes de realizar una llamada a una API de Google, verifica qué permisos ya se otorgaron
a tu app con la propiedad grantedScopes de GIDGoogleUser:
Swift
let driveScope = "https://www.googleapis.com/auth/drive.readonly"
let grantedScopes = user.grantedScopes
if grantedScopes == nil || !grantedScopes!.contains(driveScope) {
// Request additional Drive scope.
}
Objective-C
NSString *driveScope = @"https://www.googleapis.com/auth/drive.readonly";
// Check if the user has granted the Drive scope
if (![user.grantedScopes containsObject:driveScope]) {
// request additional drive scope
}
Según si el usuario otorgó o no un permiso determinado, es posible que debas solicitar un permiso adicional para admitir una interacción en particular.
2. Solicita permisos adicionales
Si necesitas solicitar permisos adicionales, llama a
addScopes:presentingViewController:completion o
addScopes:presentingWindow:completion para pedirle al usuario que le otorgue a tu app
acceso adicional.
Por ejemplo, para solicitar acceso de solo lectura a los archivos de Drive de un usuario, haz lo siguiente:
Swift
let additionalScopes = ["https://www.googleapis.com/auth/drive.readonly"]
guard let currentUser = GIDSignIn.sharedInstance.currentUser else {
return ; /* Not signed in. */
}
currentUser.addScopes(additionalScopes, presenting: self) { signInResult, error in
guard error == nil else { return }
guard let signInResult = signInResult else { return }
// Check if the user granted access to the scopes you requested.
}
Objective-C
NSArray *additionalScopes = @[ @"https://www.googleapis.com/auth/drive.readonly" ];
GIDGoogleUser *currentUser = GIDSignIn.sharedInstance.currentUser;
[currentUser addScopes:additionalScopes
presentingViewController:self
completion:^(GIDSignInResult * _Nullable signInResult,
NSError * _Nullable error) {
if (error) { return; }
if (signInResult == nil) { return; }
// Check if the user granted access to the scopes you requested.
}];
3. Realiza una llamada a la API con tokens nuevos
Para asegurarte de que tus llamadas a la API de Google siempre tengan adjuntos tokens de acceso
que no hayan vencido, une las llamadas en un bloque refreshTokensIfNeededWithCompletion::
Swift
currentUser.refreshTokensIfNeeded { user, error in
guard error == nil else { return }
guard let user = user else { return }
// Get the access token to attach it to a REST or gRPC request.
let accessToken = user.accessToken.tokenString
// Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
// use with GTMAppAuth and the Google APIs client library.
let authorizer = user.fetcherAuthorizer()
}
Objective-C
[currentUser refreshTokensIfNeededWithCompletion:^(
GIDGoogleUser * _Nullable user,
NSError * _Nullable error) {
if (error) { return; }
if (user == nil) { return; }
// Get the access token to attach it to a REST or gRPC request.
NSString *accessToken = user.accessToken.tokenString;
// Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
// use with GTMAppAuth and the Google APIs client library.
id<GTMFetcherAuthorizationProtocol> authorizer = [user fetcherAuthorizer];
}];
Usa el token de acceso para llamar a la API, ya sea incluyendo el token de acceso en
el encabezado de una solicitud de REST o gRPC
(Authorization: Bearer ACCESS_TOKEN) o usando el
autorizador de recuperador con la biblioteca cliente de las APIs de Google.