Некоторые службы 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 всегда будут прикреплены токены доступа с истекшим сроком действия, оберните вызовы в 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 .