Вы можете разрешить пользователям аутентифицироваться в Firebase с помощью поставщиков OAuth, таких как Yahoo, интегрировав в свое приложение универсальный вход через OAuth с использованием SDK Firebase для реализации сквозного процесса авторизации.
Прежде чем начать
Для авторизации пользователей с использованием учетных записей Yahoo необходимо сначала включить Yahoo в качестве поставщика авторизации для вашего проекта Firebase:
- Добавьте Firebase в свой проект Apple .
- В консоли Firebase перейдите в раздел Безопасность > Аутентификация .
- На вкладке «Способ входа» включите поставщика авторизации Yahoo .
- Добавьте идентификатор клиента (Client ID) и секретный ключ клиента (Client Secret) из консоли разработчика соответствующего поставщика в конфигурацию поставщика:
Для регистрации клиента Yahoo OAuth следуйте инструкциям в документации для разработчиков Yahoo по регистрации веб-приложения в Yahoo .
Обязательно выберите два разрешения для API OpenID Connect:
profileиemail.- При регистрации приложений у этих провайдеров обязательно зарегистрируйте домен
*.firebaseapp.comдля вашего проекта в качестве домена перенаправления для вашего приложения.
- Нажмите « Сохранить ».
Обрабатывайте процесс авторизации с помощью Firebase SDK.
Для обработки процесса авторизации с помощью SDK Firebase Apple Platforms выполните следующие действия:
Добавьте пользовательские схемы URL-адресов в свой проект Xcode:
- Откройте конфигурацию проекта: дважды щелкните имя проекта в левом древовидном представлении. Выберите свое приложение в разделе «ЦЕЛИ» , затем перейдите на вкладку «Информация» и разверните раздел «Типы URL» .
- Нажмите кнопку «+» и добавьте свой закодированный идентификатор приложения в качестве схемы URL. Остальные поля оставьте пустыми.
Вы можете найти свой закодированный идентификатор приложения в консоли Firebase : перейдите в...
> Вкладка «Общие» , затем прокрутите вниз до раздела «Ваши приложения» , чтобы просмотреть подробную информацию о вашем приложении iOS. После завершения настройки ваш конфигурационный файл должен выглядеть примерно так (но с учетом значений, специфичных для вашего приложения):

Создайте экземпляр OAuthProvider , используя идентификатор поставщика yahoo.com .
Быстрый
var provider = OAuthProvider(providerID: "yahoo.com")
Objective-C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"yahoo.com"];
Необязательно : укажите дополнительные пользовательские параметры OAuth, которые вы хотите отправить вместе с запросом OAuth.
Быстрый
provider.customParameters = [ "prompt": "login", "language": "fr" ]
Objective-C
[provider setCustomParameters:@{@"prompt": @"login", @"language": @"fr"}];
Информацию о параметрах, поддерживаемых Yahoo, см. в документации Yahoo OAuth . Обратите внимание, что с помощью
setCustomParametersнельзя передавать параметры, необходимые для Firebase. К таким параметрам относятся client_id , redirect_uri , response_type , scope и state .Необязательно : укажите дополнительные области действия OAuth 2.0, помимо
profileиemail, которые вы хотите запросить у поставщика аутентификации. Если вашему приложению требуется доступ к личным данным пользователей через API Yahoo, вам необходимо запросить разрешения для API Yahoo в разделе «Разрешения API» в консоли разработчика Yahoo. Запрашиваемые области действия OAuth должны точно соответствовать предварительно настроенным в разрешениях API приложения. Например, если запрашивается доступ на чтение/запись к контактам пользователя и он предварительно настроен в разрешениях API приложения, необходимо передатьsdct-wвместо области действия OAuth только для чтенияsdct-r. В противном случае процесс завершится с ошибкой, и конечному пользователю будет показано сообщение об ошибке.Быстрый
// Request access to Yahoo Mail API. // Request read/write access to user contacts. // This must be preconfigured in the app's API permissions. provider.scopes = ["mail-r", "sdct-w"]
Objective-C
// Request access to Yahoo Mail API. // Request read/write access to user contacts. // This must be preconfigured in the app's API permissions. [provider setScopes:@[@"mail-r", @"sdct-w"]];
Для получения более подробной информации обратитесь к документации Yahoo по областям видимости .
Необязательно : если вы хотите настроить способ отображения
SFSafariViewControllerилиUIWebViewпри показе reCAPTCHA пользователю, создайте пользовательский класс, соответствующий протоколуAuthUIDelegate, и передайте его вcredentialWithUIDelegate.Аутентификация в Firebase осуществляется с помощью объекта поставщика OAuth.
Быстрый
provider.getCredentialWith(nil) { credential, error in if error != nil { // Handle error. } if credential != nil { Auth().signIn(with: credential) { authResult, error in if error != nil { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken } } }
Objective-C
[provider getCredentialWithUIDelegate:nil completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) { if (error) { // Handle error. } if (credential) { [[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { if (error) { // Handle error. } // User is signed in. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }]; } }];
Используя токен доступа OAuth, вы можете вызвать API Yahoo .
Например, для получения основной информации о профиле можно вызвать REST API, передав токен доступа в заголовке
Authorization:https://social.yahooapis.com/v1/user/YAHOO_USER_UID/profile?format=json
Где
YAHOO_USER_UID— это идентификатор пользователя Yahoo, который можно получить из поляAuth.auth.currentUser.providerData[0].uidили изauthResult.additionalUserInfo.profile.Хотя приведенные выше примеры сосредоточены на процессах входа в систему, у вас также есть возможность связать поставщика услуг Yahoo с существующим пользователем с помощью
linkWithPopup. Например, вы можете связать несколько поставщиков услуг с одним и тем же пользователем, позволяя ему входить в систему с помощью любого из них.Быстрый
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // Yahoo credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken }
Objective-C
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // Yahoo credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // Yahoo OAuth access token is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }];
Аналогичный подход можно использовать с
reauthenticateWithPopup/reauthenticateWithRedirect, которые позволяют получить актуальные учетные данные для выполнения конфиденциальных операций, требующих недавнего входа в систему.Быстрый
Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token is can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // Yahoo OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken }
Objective-C
[[FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Additional OAuth access token is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // Yahoo OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }];
Следующие шаги
После первого входа пользователя в систему создается новая учетная запись, которая связывается с учетными данными — то есть именем пользователя и паролем, номером телефона или информацией о поставщике аутентификации, — которые пользователь использовал для входа. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя во всех приложениях вашего проекта, независимо от способа входа пользователя.
В ваших приложениях вы можете получить основную информацию профиля пользователя из объекта
User. См. раздел «Управление пользователями» .В правилах безопасности Firebase Realtime Database и Cloud Storage вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
authи использовать его для управления доступом пользователя к данным.
Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Для выхода из системы пользователя вызовите signOut: .
Быстрый
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Также может потребоваться добавить код обработки ошибок для всего спектра ошибок аутентификации. См. раздел «Обработка ошибок» .