Если вы перешли на Firebase Authentication with Identity Platform, вы можете аутентифицировать своих пользователей с помощью Firebase, используя поставщика, совместимого с OpenID Connect (OIDC), по вашему выбору. Это позволяет использовать поставщиков удостоверений, изначально не поддерживаемых Firebase.
Прежде чем вы начнете
Чтобы войти в систему с помощью поставщика OIDC, необходимо сначала получить некоторую информацию от поставщика:
Идентификатор клиента : строка, уникальная для поставщика, которая идентифицирует ваше приложение. Ваш провайдер может назначить вам разные идентификаторы клиентов для каждой поддерживаемой вами платформы. Это одно из значений утверждения
aud
в токенах ID, выданных вашим провайдером.Секрет клиента : секретная строка, которую поставщик использует для подтверждения владения идентификатором клиента. Для каждого идентификатора клиента вам потребуется соответствующий секрет клиента. (Это значение требуется, только если вы используете поток кода авторизации , что настоятельно рекомендуется.)
Эмитент : строка, идентифицирующая вашего провайдера. Это значение должно быть 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
Если вы создаете приложение для Android, самый простой способ аутентификации пользователей в Firebase с помощью поставщика OIDC — это обработка всего процесса входа с помощью Firebase Android SDK.
Чтобы обработать процесс входа с помощью Firebase Android SDK, выполните следующие действия:
Создайте экземпляр OAuthProvider , используя его Builder с идентификатором поставщика.
Kotlin+KTX
val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
Java
OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
Необязательно : укажите дополнительные настраиваемые параметры OAuth, которые вы хотите отправить с запросом OAuth.
Kotlin+KTX
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com")
Java
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com");
Узнайте у своего поставщика OIDC, какие параметры он поддерживает. Обратите внимание, что вы не можете передавать параметры, необходимые для Firebase, с помощью
setCustomParameters()
. Это параметры client_id , response_type , redirect_uri , state , scope и response_mode .Необязательно : укажите дополнительные области действия OAuth 2.0 помимо базового профиля, которые вы хотите запросить у поставщика проверки подлинности.
Kotlin+KTX
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. providerBuilder.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; providerBuilder.setScopes(scopes);
Узнайте у своего поставщика OIDC, какие области он использует.
Выполните аутентификацию в Firebase, используя объект поставщика OAuth. Обратите внимание, что в отличие от других операций FirebaseAuth, эта операция возьмет на себя управление вашим пользовательским интерфейсом, открыв настраиваемую вкладку Chrome . В результате не ссылайтесь на свою активность в
OnSuccessListener
иOnFailureListener
, которые вы присоединяете, так как они сразу же отсоединяются, когда операция запускает пользовательский интерфейс.Вы должны сначала проверить, если вы уже получили ответ. Вход с помощью этого метода переводит вашу активность в фоновый режим, что означает, что она может быть восстановлена системой во время процесса входа. Чтобы убедиться, что вы не заставите пользователя повторить попытку, если это произойдет, вы должны проверить, присутствует ли уже результат.
Чтобы проверить, есть ли ожидающий результат, вызовите
getPendingAuthResult
:Kotlin+KTX
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Чтобы запустить процесс входа, вызовите
startActivityForSignInWithProvider
:Kotlin+KTX
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Хотя в приведенных выше примерах основное внимание уделяется потокам входа, у вас также есть возможность связать поставщика OIDC с существующим пользователем с помощью
startActivityForLinkWithProvider
. Например, вы можете связать нескольких провайдеров с одним и тем же пользователем, позволяя им входить в систему с помощью любого из них.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Тот же шаблон можно использовать с
startActivityForReauthenticateWithProvider
, который можно использовать для получения новых учетных данных для конфиденциальных операций, требующих недавнего входа в систему.Kotlin+KTX
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Обработка процесса входа вручную
Если вы уже внедрили процесс входа OpenID Connect в свое приложение, вы можете использовать токен ID напрямую для аутентификации в Firebase:
Kotlin+KTX
val providerId = "oidc.example-provider" // As registered in Firebase console. val credential = oAuthCredential(providerId) { setIdToken(idToken) // ID token from OpenID Connect flow. } Firebase.auth .signInWithCredential(credential) .addOnSuccessListener { authResult -> // User is signed in. // IdP data available in: // authResult.additionalUserInfo.profile } .addOnFailureListener { e -> // Handle failure. }
Java
AuthCredential credential = OAuthProvider .newCredentialBuilder("oidc.example-provider") // As registered in Firebase console. .setIdToken(idToken) // ID token from OpenID Connect flow. .build(); FirebaseAuth.getInstance() .signInWithCredential(credential) .addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in: // authResult.getAdditionalUserInfo().getProfile() } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Следующие шаги
После того, как пользователь входит в систему в первый раз, создается новая учетная запись пользователя и связывается с учетными данными, т. е. с именем пользователя и паролем, номером телефона или информацией о поставщике проверки подлинности, с которыми пользователь вошел в систему. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя во всех приложениях вашего проекта, независимо от того, как пользователь входит в систему.
В своих приложениях вы можете получить основную информацию о профиле пользователя из объекта
FirebaseUser
. См. Управление пользователями .В правилах безопасности базы данных Firebase Realtime и облачного хранилища вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
auth
и использовать его для управления тем, к каким данным пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с помощью нескольких поставщиков проверки подлинности, связав учетные данные поставщика проверки подлинности с существующей учетной записью пользователя.
Чтобы выйти из системы, вызовите signOut
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();