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 estas de Google Cloud. Para acceder a estos servicios, las apps deben implementar uno de los protocolos OAuth 2.0 para obtener el consentimiento de los usuarios y 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 para para obtener tokens de acceso para el usuario que accedió.
Antes de comenzar
Debes completar la integración básica de Acceso con Google.
1. Verifica qué permisos se otorgaron
Antes de llamar a una API de Google, comprueba qué permisos ya se utilizaron
otorgado 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
}
En función de si el usuario otorgó o no cierto alcance, podrías necesitamos realizar una solicitud de un permiso adicional para respaldar un interacción.
2. Solicita permisos adicionales
Si necesitas solicitar permisos adicionales, llama
addScopes:presentingViewController:completion
o
addScopes:presentingWindow:completion
para pedirle al usuario que otorgue 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 tokens de acceso no vencidos
adjunto, 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 recuperación con el
Biblioteca cliente de las APIs de Google.