Некоторые службы Google, такие как Диск, Gmail и многие другие, предоставляют общедоступные API, которые можно использовать для создания приложений, помогающих пользователям работать со своими данными в этих службах. Чтобы получить доступ к этим службам, приложения должны реализовать один из клиентских потоков OAuth 2.0, чтобы получить согласие пользователей и получить токены доступа , которые предоставляют доступ к API.
Вы можете использовать библиотеку Google Sign-In, которая реализует поток OAuth 2.0, чтобы получить токены доступа для вошедшего в систему пользователя.
Прежде чем вы начнете
Вам необходимо выполнить базовую интеграцию входа в Google .
1. Проверьте, какие области действия предоставлены.
Прежде чем вызывать API Google, проверьте, какие области действия уже предоставлены вашему приложению, используя свойство grantedScopes
GIDGoogleUser
:
Быстрый
let driveScope = "https://www.googleapis.com/auth/drive.readonly"
let grantedScopes = user.grantedScopes
if grantedScopes == nil || !grantedScopes!.contains(driveScope) {
// Request additional Drive scope.
}
Цель-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
}
В зависимости от того, была ли предоставлена пользователем определенная область, вам может потребоваться запросить дополнительную область для поддержки определенного взаимодействия.
2. Запросить дополнительные объемы
Если вам нужно запросить дополнительные области, вызовите addScopes:presentingViewController:completion
или addScopes:presentingWindow:completion
, чтобы попросить пользователя предоставить вашему приложению дополнительный доступ.
Например, чтобы запросить доступ только для чтения к файлам пользователя на Диске:
Быстрый
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.
}
Цель-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. Сделайте вызов API со свежими токенами.
Чтобы гарантировать, что к вашим вызовам API Google всегда будут прикреплены токены доступа с истекшим сроком действия, оберните вызовы в блокrefreTokensIfNeededWithCompletion refreshTokensIfNeededWithCompletion:
Быстрый
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()
}
Цель-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];
}];
Используйте токен доступа для вызова API, включив токен доступа в заголовок запроса REST или gRPC ( Authorization: Bearer ACCESS_TOKEN
) или используя авторизатор выборки с клиентской библиотекой API Google .