Вы можете разрешить пользователям выполнять аутентификацию в Firebase с помощью Apple ID, используя Firebase SDK для реализации сквозного процесса входа OAuth 2.0.
Подготовка
Чтобы пользователи могли входить в систему с помощью Apple, сначала настройте функцию "Войти с Apple" на сайте для разработчиков Apple, а затем включите Apple в качестве поставщика учетных данных для входа в проект Firebase.
Как присоединиться к программе Apple Developer Program
Настроить функцию "Войти через аккаунт Apple" могут только участники программы для разработчиков Apple.
Как настроить вход через аккаунт Apple
В проекте Firebase должна быть включена и правильно настроена функция "Войти с Apple". Конфигурация Apple Developer различается на платформах Android и Apple. Прежде чем продолжить, следуйте инструкциям в разделе "Настройка входа с Apple ID" руководства по iOS+ и/или Android.Как включить Apple в качестве поставщика услуг входа
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Способ входа включите поставщика для входа через Apple.
- Настройте параметры поставщика "Войти с Apple":
- Apple. Если вы развертываете приложение только на платформах Apple, поля "Идентификатор сервиса", "Идентификатор команды Apple", "Закрытый ключ" и "Идентификатор ключа" можно оставить пустыми.
-
Android. Чтобы поддерживать устройства Android, выполните следующие действия:
- Добавьте Firebase в проект для Android.
-
Укажите цифровой отпечаток SHA-1 приложения, если вы ещё этого не сделали.
-
В консоли Firebase перейдите на вкладку
Настройки > Общие. - Прокрутите страницу вниз до карточки Ваши приложения, выберите приложение Android и добавьте цифровой отпечаток SHA-1 в поле Цифровые отпечатки сертификата SHA.
О том, как получить цифровой отпечаток SHA приложения, можно прочитать в разделе об аутентификации клиентов.
-
В консоли Firebase перейдите на вкладку
-
Настройте параметры поставщика "Войти с Apple":
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Способ входа нажмите на поставщика услуг входа Apple.
- Укажите идентификатор сервиса, созданный в предыдущем разделе. Кроме того, в разделе конфигурации потока кода OAuth укажите идентификатор команды Apple, закрытый ключ и идентификатор ключа, созданные в предыдущем разделе.
Соблюдайте требования Apple к анонимизированным данным
При входе через Apple ID пользователи могут анонимизировать свои данные, в том числе адрес электронной почты. Пользователи, которые выберут этот вариант, получат адреса электронной почты с доменом privaterelay.appleid.com. При использовании функции "Войти с Apple" в приложении вы должны соблюдать все применимые правила для разработчиков и условия использования Apple, касающиеся анонимизированных идентификаторов Apple.
В частности, перед тем как связать с анонимизированным идентификатором Apple ID любую информацию, позволяющую установить личность, вы должны получить согласие пользователя, если это необходимо. При использовании Firebase Authentication могут выполняться следующие действия:
- Связать адрес электронной почты с анонимным Apple ID или наоборот.
- Как связать номер телефона с анонимизированным Apple ID или наоборот
- Связать анонимный идентификатор Apple ID с неанонимными учетными данными социальной сети (Facebook, Google и т. д.) или наоборот.
Этот список не является исчерпывающим. Чтобы убедиться, что ваше приложение соответствует требованиям Apple, ознакомьтесь с лицензионным соглашением программы для разработчиков Apple в разделе "Членство" вашего аккаунта разработчика.
Как получить доступ к курсу Firebase.Auth.FirebaseAuth
Класс FirebaseAuth – это шлюз для всех вызовов API.
Он доступен через FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
Как обрабатывать процесс входа с помощью Firebase SDK
Процесс входа с аккаунтом Apple различается на платформах Apple и Android.
На платформах Apple
Установите сторонний плагин для обработки одноразовых кодов и токенов для входа с аккаунтом Apple, например пакет Unity's Sign In With Apple Asset Storage. Возможно, вам потребуется изменить код, чтобы передать сгенерированную случайную строку nonce в ее исходном виде для использования в операциях Firebase (то есть сохранить ее копию до создания хеша SHA256).
Используйте полученную строку токена и необработанное одноразовое число, чтобы создать Firebase Credential и войти в Firebase.
Firebase.Auth.Credential credential = Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, appleAuthorizationCode); auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => { if (task.IsCanceled) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception); return; } Firebase.Auth.AuthResult result = task.Result; Debug.LogFormat("User signed in successfully: {0} ({1})", result.User.DisplayName, result.User.UserId); });
Аналогичный шаблон можно использовать с функцией
ReauthenticateAsync, которая позволяет получать новые учетные данные для выполнения конфиденциальных операций, требующих недавнего входа в систему. Подробнее о том, как управлять пользователями…При связывании с аккаунтом Apple на платформах Apple может возникнуть ошибка, связанная с тем, что аккаунт Firebase уже связан с аккаунтом Apple. В этом случае вместо стандартного исключения
Firebase.FirebaseExceptionбудет сгенерировано исключениеFirebase.Auth.FirebaseAccountLinkException. В этом случае исключение содержит свойствоUserInfo.UpdatedCredential, которое, если оно действительно, можно использовать для входа пользователя, связанного с Apple, черезFirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. Обновленные учетные данные позволяют не создавать новый токен для входа через Apple с однократно используемым номером.auth.CurrentUser.LinkWithCredentialAsync( Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null)) .ContinueWithOnMainThread( task => { if (task.IsCompletedSuccessfully) { // Link Success } else { if (task.Exception != null) { foreach (Exception exception in task.Exception.Flatten().InnerExceptions) { Firebase.Auth.FirebaseAccountLinkException firebaseEx = exception as Firebase.Auth.FirebaseAccountLinkException; if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) { // Attempt to sign in with the updated credential. auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential). ContinueWithOnMainThread( authResultTask => { // Handle Auth result. }); } else { Debug.Log("Link with Apple failed:" + firebaseEx ); } } // end for loop } } });
На устройстве Android
На устройствах Android аутентификация пользователей выполняется с помощью Firebase. Для этого в приложение интегрируется универсальный вход OAuth на основе веб-технологий с использованием Firebase SDK.
Чтобы реализовать процесс входа с помощью Firebase SDK, выполните следующие действия:
Создайте экземпляр
FederatedOAuthProviderData, настроенный с идентификатором поставщика, подходящим для Apple.Firebase.Auth.FederatedOAuthProviderData providerData = new Firebase.Auth.FederatedOAuthProviderData(); providerData.ProviderId = "apple.com";Необязательно. Укажите дополнительные области действия OAuth 2.0, которые вы хотите запросить у поставщика услуг аутентификации.
providerData.Scopes = new List<string>(); providerData.Scopes.Add("email"); providerData.Scopes.Add("name");Необязательно. Если вы хотите, чтобы экран входа в аккаунт Apple отображался не на английском языке, задайте параметр
locale. Список поддерживаемых языков можно найти в документации по входу через Apple.providerData.CustomParameters = new Dictionary<string,string>; // Localize to French. providerData.CustomParameters.Add("language", "fr");После того как вы настроите данные поставщика, используйте их, чтобы создать FederatedOAuthProvider.
// Construct a FederatedOAuthProvider for use in Auth methods. Firebase.Auth.FederatedOAuthProvider provider = new Firebase.Auth.FederatedOAuthProvider(); provider.SetProviderData(providerData);Выполните аутентификацию в Firebase с помощью объекта поставщика аутентификации. Обратите внимание, что в отличие от других операций FirebaseAuth эта операция перехватывает управление интерфейсом, показывая веб-представление, в котором пользователь может ввести свои учетные данные.
Чтобы начать процесс входа, вызовите
signInWithProvider:auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => { if (task.IsCanceled) { Debug.LogError("SignInWithProviderAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("SignInWithProviderAsync encountered an error: " + task.Exception); return; } Firebase.Auth.AuthResult authResult = task.Result; Firebase.Auth.FirebaseUser user = authResult.User; Debug.LogFormat("User signed in successfully: {0} ({1})", user.DisplayName, user.UserId); });Аналогичный шаблон можно использовать с функцией
ReauthenticateWithProvider, которая позволяет получать новые учетные данные для выполнения конфиденциальных операций, требующих недавнего входа в систему.user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => { if (task.IsCanceled) { Debug.LogError("ReauthenticateWithProviderAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError( "ReauthenticateWithProviderAsync encountered an error: " + task.Exception); return; } Firebase.Auth.AuthResult authResult = task.Result; Firebase.Auth.FirebaseUser user = authResult.User; Debug.LogFormat("User reauthenticated successfully: {0} ({1})", user.DisplayName, user.UserId); });Кроме того, с помощью
LinkWithCredentialAsync()можно связать разных поставщиков идентификационной информации с существующими аккаунтами.Обратите внимание, что Apple требует получать явное согласие пользователей перед тем, как связывать их аккаунты Apple с другими данными.
Например, чтобы связать аккаунт Facebook с текущим аккаунтом Firebase, используйте токен доступа, полученный при входе пользователя в Facebook:
// Initialize a Facebook credential with a Facebook access token. Firebase.Auth.Credential credential = Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token); // Assuming the current user is an Apple user linking a Facebook provider. user.LinkWithCredentialAsync(credential) .ContinueWithOnMainThread( task => { if (task.IsCanceled) { Debug.LogError("LinkWithCredentialAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception); return; } Firebase.Auth.AuthResult result = task.Result; Firebase.Auth.FirebaseUser user = result.User; Debug.LogFormat("User linked successfully: {0} ({1})", user.DisplayName, user.UserId); });
Как войти в аккаунт с помощью приложения "Заметки" от Apple
В отличие от других поставщиков, поддерживаемых Firebase Auth, Apple не предоставляет URL фотографии.
Если пользователь не хочет делиться своим адресом электронной почты с приложением, Apple предоставляет ему уникальный адрес (в формате xyz@privaterelay.appleid.com), который передается приложению. Если вы настроили службу ретрансляции частных электронных адресов, Apple пересылает письма, отправленные на анонимизированный адрес, на настоящий адрес пользователя.
Apple передает приложениям информацию о пользователе, например отображаемое имя, только при первом входе в аккаунт. Обычно Firebase сохраняет отображаемое имя при первом входе пользователя с помощью Apple ID. Получить его можно с помощью auth.CurrentUser.DisplayName.
Однако если вы ранее использовали Apple для входа пользователя в приложение без Firebase, Apple не предоставит Firebase отображаемое имя пользователя.
Дальнейшие действия
После первого входа пользователя создается новый аккаунт, связанный с учетными данными, которые он использовал при входе (именем пользователя и паролем, номером телефона или информацией поставщика услуг аутентификации). Новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта независимо от того, как он вошел в аккаунт.В приложениях можно получить основную информацию профиля пользователя из объекта Firebase.Auth.FirebaseUser. Подробнее о том, как управлять пользователями…
В правилах безопасности для Firebase Realtime Database и Cloud Storage можно получить уникальный идентификатор пользователя, выполнившего вход, из переменной auth и использовать его, чтобы контролировать, к каким данным пользователь может получить доступ.