Некоторые сервисы Google, такие как Диск, Gmail и многие другие, предоставляют общедоступные API, которые можно использовать для создания приложений, помогающих пользователям работать со своими данными в этих сервисах. Чтобы получить доступ к этим сервисам, приложения должны реализовать один из клиентских потоков OAuth 2.0 для получения согласия от пользователей и токенов доступа, которые предоставляют доступ к API.
Чтобы получить токены доступа для вошедшего в систему пользователя, вы можете использовать библиотеку входа с аккаунтом Google, которая реализует процесс OAuth 2.0.
Требования
Чтобы ваше приложение для iOS могло вызывать API Google, выполните следующие действия:
1. Как включить API для проекта
Любое приложение, вызывающее API Google, должно включить эти API в консоли Google Cloud.
Чтобы включить API для вашего проекта:
- Откройте библиотеку API в консоли Google Cloud.
- Выберите существующий проект или создайте новый.
- Выберите нужный API и нажмите Включить.
2. Создайте учетные данные для авторизации
Любое приложение iOS, которое использует OAuth 2.0 для доступа к API Google, должно иметь учетные данные для авторизации, которые идентифицируют приложение на сервере авторизации Google. Чтобы создать учетные данные для проекта, выполните следующие действия:
- Откройте страницу Credentials (Учетные данные) в консоли Google Cloud.
- Нажмите Create client (Создать клиент) или Create Credentials (Создать учетные данные) > OAuth client ID (Идентификатор клиента OAuth).
- Выберите тип приложения iOS.
- Введите название клиента OAuth. Это название идентифицирует клиента на странице учетных данных проекта.
- Введите идентификатор пакета приложения. Это значение ключа
CFBundleIdentifierв файлеInfo.plist. Обычно это значение можно найти на панели General (Общие) или Signing & Capabilities (Подпись и возможности) в редакторе проектов Xcode, а также на странице App Information (Информация о приложении) в Apple App Store Connect. Убедитесь, что вы используете правильный идентификатор пакета, поскольку его нельзя изменить, если вы используете Проверку приложений. - Если приложение опубликовано в Apple App Store, укажите его идентификатор в этом магазине (необязательно). Идентификатор магазина – это числовая строка, которая входит в URL каждого приложения в Apple App Store.
- При необходимости введите идентификатор команды. Подробнее о том, как найти идентификатор команды в документации по аккаунту разработчика Apple. Идентификатор команды необходим, если вы включаете проверку приложений для своего клиента.
- (Необязательно.) Включите проверку приложений для приложения iOS. В этом случае сервис App Attest от Apple будет проверять, что запросы OAuth 2.0, поступающие от вашего клиента OAuth, подлинные и исходят от вашего приложения. Это помогает снизить риск имитации приложения.
- Нажмите Создать.
Идентификатор клиента будет создан и показан в консоли Google Cloud. Добавьте схему URL идентификатора клиента в обратном порядке (например, com.googleusercontent.apps.1234567890-abcdef) в файл Info.plist приложения, чтобы обрабатывать перенаправления авторизации.
3. Как выполнить базовую интеграцию входа с аккаунтом Google
Прежде чем запрашивать дополнительные области действия и вызывать API Google, выполните базовую интеграцию входа с аккаунтом Google.
1. Как проверить, какие области действия были предоставлены
Прежде чем вызывать API Google, проверьте, какие области действия уже предоставлены вашему приложению, используя свойство grantedScopes объекта 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
}
В зависимости от того, предоставил ли пользователь определенную область действия, вам может потребоваться запросить дополнительную область действия для поддержки определенного взаимодействия.
2. Запрос дополнительных областей действия
Если вам нужно запросить дополнительные области действия, вызовите addScopes:presentingViewController:completion или addScopes:presentingWindow:completion, чтобы попросить пользователя предоставить вашему приложению дополнительный доступ.
Например, чтобы запросить доступ только для чтения к файлам пользователя на Диске:
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. Вызовите API с новыми токенами
Чтобы у вызовов API Google всегда были действительные токены доступа, оберните вызовы в блок 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];
}];
Используйте токен доступа для вызова API, включив его в заголовок запроса REST или gRPC (Authorization: Bearer ACCESS_TOKEN) или используя авторизатор средства извлечения с клиентской библиотекой API Google.