Если вы перешли на версию Firebase Authentication with Identity Platform, то можете аутентифицировать пользователей в Firebase с помощью любого поставщика, совместимого с OpenID Connect (OIDC). Это позволяет использовать поставщиков идентификационной информации, которые не поддерживаются Firebase изначально.
Подготовка
Чтобы пользователи могли входить в аккаунт с помощью поставщика OIDC, сначала нужно собрать у него следующую информацию:
Идентификатор клиента – уникальная строка, которая идентифицирует ваше приложение. Поставщик может назначить вам разные идентификаторы клиента для каждой поддерживаемой платформы. Это одно из значений утверждения
audв токенах идентификаторов, выпущенных вашим поставщиком.Секретный код клиента. Секретная строка, которую поставщик использует, чтобы подтвердить право собственности на идентификатор клиента. Для каждого идентификатора клиента потребуется соответствующий секретный код клиента. (Это значение требуется, только если вы используете обработку кода авторизации, что настоятельно рекомендуется.)
Эмитент. Строка, идентифицирующая вашего поставщика. Это значение должно быть URL, который при добавлении к нему символа косой черты (
/.well-known/openid-configuration) указывает на местоположение документа обнаружения OIDC поставщика. Например, если издатель –https://auth.example.com, документ обнаружения должен быть доступен по адресуhttps://auth.example.com/.well-known/openid-configuration.
Когда у вас будет вся необходимая информация, включите OpenID Connect в качестве поставщика услуг входа для проекта Firebase:
Если вы ещё не перешли на версию Firebase Authentication with Identity Platform, сделайте это. Аутентификация OpenID Connect доступна только в проектах, обновленных до этой версии.
В консоли Firebase выберите Безопасность > Аутентификация.
На вкладке Способ входа нажмите Добавить нового поставщика и выберите OpenID Connect.
Выберите, какой тип авторизации вы будете использовать: обработку кода авторизации или неявное предоставление разрешения.
Если ваш поставщик поддерживает обработку кода, всегда используйте ее. Неявное предоставление доступа менее безопасно, поэтому его использование настоятельно не рекомендуется.
Укажите название поставщика. Запишите сгенерированный идентификатор поставщика, например
oidc.example-provider. Он понадобится вам, когда вы будете добавлять в приложение код для входа в аккаунт.Укажите идентификатор и секретный код клиента, а также строку издателя поставщика. Эти значения должны в точности совпадать с теми, которые вам предоставил поставщик.
Сохраните изменения.
Как обрабатывать процесс входа с помощью Firebase SDK
Самый простой способ аутентификации пользователей в Firebase с помощью поставщика OIDC – это реализовать весь процесс входа с помощью Firebase SDK.
Чтобы реализовать процесс входа с помощью Firebase SDK для платформ Apple, выполните следующие действия:
Добавьте в проект Xcode специальные схемы URL:
- Откройте конфигурацию проекта: дважды нажмите на название проекта в древовидном представлении слева. Выберите приложение в разделе ЦЕЛЕВЫЕ ПРИЛОЖЕНИЯ, откройте вкладку Информация и разверните раздел Типы URL.
-
Нажмите кнопку + и добавьте зашифрованный идентификатор приложения в качестве схемы URL.
Оставьте другие поля пустыми.
Закодированный идентификатор приложения можно найти в консоли Firebase. Для этого перейдите на вкладку
Настройки > Общие и прокрутите страницу вниз до раздела Ваши приложения, чтобы посмотреть сведения о приложении для iOS.После этого конфигурация должна выглядеть примерно так (но с вашими значениями):
Создайте экземпляр
OAuthProvider, используя идентификатор поставщика, полученный в консоли Firebase.Swift
var provider = OAuthProvider(providerID: "oidc.example-provider")Objective-C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];Необязательно. Укажите дополнительные специальные параметры OAuth, которые вы хотите отправить с запросом OAuth.
Swift
provider.customParameters = [ "login_hint": "user@example.com" ]Objective-C
[provider setCustomParameters:@{@"login_hint": @"user@example.com"}];Узнайте у поставщика, какие параметры он поддерживает. Обратите внимание, что с помощью
setCustomParametersнельзя передавать параметры, обязательные для Firebase. Это параметрыclient_id,response_type,redirect_uri,state,scopeиresponse_mode.Необязательно. Укажите дополнительные области действия OAuth 2.0, помимо базового профиля, которые вы хотите запросить у поставщика услуг аутентификации.
Swift
provider.scopes = ["mail.read", "calendars.read"]Objective-C
[provider setScopes:@[@"mail.read", @"calendars.read"]];Узнайте у поставщика, какие области он поддерживает.
Необязательно. Если вы хотите настроить способ, которым приложение представляет
SFSafariViewControllerилиUIWebViewпри показе reCAPTCHA пользователю, создайте специальный класс, соответствующий протоколуAuthUIDelegate.Выполните аутентификацию в Firebase, используя объект поставщика OAuth.
Swift
// If you created a custom class that conforms to AuthUIDelegate, // pass it instead of nil: 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. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken } } }Objective-C
// If you created a custom class that conforms to AuthUIDelegate, // pass it instead of nil: [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. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }]; } }];В приведенных выше примерах основное внимание уделяется процессам входа в систему, но вы также можете связать поставщика OIDC с существующим пользователем, используя
linkWithCredential. Например, вы можете связать несколько поставщиков с одним пользователем, чтобы он мог входить в систему с помощью любого из них.Swift
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // OIDC credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (authResult.credential as? OAuthCredential)?.idToken }Objective-C
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // OIDC credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // OAuth access token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];Аналогичный шаблон можно использовать с
reauthenticateWithCredential, чтобы получать новые учетные данные для конфиденциальных операций, требующих недавнего входа в систему.Swift
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 can also be retrieved: // (authResult.credential as? OAuthCredential)?.accessToken // OAuth ID token can also be retrieved: // (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 can also be retrieved: // ((FIROAuthCredential *)authResult.credential).accessToken // OAuth ID token can also be retrieved: // ((FIROAuthCredential *)authResult.credential).idToken }];
Как обрабатывать процесс входа вручную
Если вы уже реализовали в приложении процесс входа через OpenID Connect, то можете использовать токен идентификатора напрямую для аутентификации в Firebase:
Swift
let credential = OAuthProvider.credential(
withProviderID: "oidc.example-provider", // As registered in Firebase console.
idToken: idToken, // ID token from OpenID Connect flow.
rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
if error {
// Handle error.
return
}
// User is signed in.
// IdP data available in authResult?.additionalUserInfo?.profile
}
Objective-C
FIROAuthCredential *credential =
[FIROAuthProvider credentialWithProviderID:@"oidc.example-provider" // As registered in Firebase console.
IDToken:idToken // ID token from OpenID Connect flow.
rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
if (error != nil) {
// Handle error.
return;
}
// User is signed in.
// IdP data available in authResult.additionalUserInfo.profile
}];
Дальнейшие действия
После первого входа пользователя создается новый аккаунт, связанный с учетными данными, которые он использовал (именем пользователя и паролем, номером телефона или информацией поставщика услуг аутентификации). Этот новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта независимо от того, как он вошел в аккаунт.
-
В своих приложениях вы можете получать основную информацию профиля пользователя из объекта
User. Подробнее о том, как управлять пользователями… В Firebase Realtime Database и Cloud Storage правилах безопасности можно получить уникальный идентификатор пользователя, выполнившего вход, из переменной
authи использовать его, чтобы контролировать, к каким данным у пользователя есть доступ.
Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков услуг аутентификации, связав учетные данные поставщика услуг аутентификации с существующим аккаунтом пользователя.
Чтобы выйти из аккаунта пользователя, вызовите функцию
signOut:.
Swift
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; }
Также рекомендуем добавить код обработки ошибок для всех возможных ошибок аутентификации. Подробнее об обработке ошибок…