Вы можете позволить своим пользователям проходить аутентификацию в Firebase, используя свой Apple ID, используя Firebase SDK для выполнения сквозного процесса входа OAuth 2.0.
Прежде чем вы начнете
Чтобы входить в систему с помощью Apple, сначала настройте вход с помощью Apple на сайте разработчиков Apple, а затем включите Apple в качестве поставщика входа для вашего проекта Firebase.
Присоединяйтесь к программе Apple для разработчиков
Вход с помощью Apple может быть настроен только участниками программы Apple Developer Program .
Настройка входа с помощью Apple
Apple Sign In должен быть включен и правильно настроен в вашем проекте Firebase. Конфигурация Apple Developer различается для разных платформ Android и Apple. Прежде чем продолжить, следуйте инструкциям в разделе «Настройка входа с помощью Apple» в руководствах для iOS+ и/или Android .Включить Apple в качестве поставщика услуг входа
- В консоли Firebase откройте раздел Auth . На вкладке Способ входа включите поставщика Apple .
- Настройте параметры провайдера Apple Sign In:
- Если вы развертываете приложение только на платформах Apple, поля «Идентификатор службы», «Идентификатор команды Apple», «Закрытый ключ» и «Идентификатор ключа» можно оставить пустыми.
- Для поддержки на устройствах Android:
- Добавьте Firebase в свой Android-проект . Обязательно зарегистрируйте подпись SHA-1 вашего приложения при настройке приложения в консоли Firebase.
- В консоли Firebase откройте раздел Auth . На вкладке Способ входа включите поставщика Apple . Укажите идентификатор службы, созданный в предыдущем разделе. Кроме того, в разделе конфигурации потока кода OAuth укажите свой идентификатор Apple Team, а также закрытый ключ и идентификатор ключа, созданные в предыдущем разделе.
Соблюдайте требования Apple к анонимным данным
Войти с Apple дает пользователям возможность анонимизировать свои данные, включая адрес электронной почты, при входе в систему. Пользователи, которые выбирают этот вариант, имеют адреса электронной почты с доменом privaterelay.appleid.com
. Когда вы используете «Войти через Apple» в своем приложении, вы должны соблюдать все применимые политики или условия Apple для разработчиков в отношении этих анонимных идентификаторов Apple ID.
Это включает в себя получение любого необходимого согласия пользователя, прежде чем вы свяжете какую-либо личную информацию, непосредственно идентифицирующую личность, с анонимным Apple ID. При использовании Firebase Authentication это может включать следующие действия:
- Свяжите адрес электронной почты с анонимным Apple ID или наоборот.
- Привязать номер телефона к анонимному Apple ID или наоборот
- Свяжите неанонимные социальные учетные данные (Facebook, Google и т. д.) с анонимным Apple ID или наоборот.
Приведенный выше список не является исчерпывающим. См. Лицензионное соглашение программы Apple Developer Program в разделе «Членство» вашей учетной записи разработчика, чтобы убедиться, что ваше приложение соответствует требованиям 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 Package . Возможно, вам придется изменить код, чтобы преобразовать сгенерированную случайную строку одноразового номера в состояние необработанной строки для использования в операциях Firebase (то есть сохранить ее копию до создания формы дайджеста SHA256 для одноразового номера).
Используйте полученную строку токена и необработанный одноразовый номер, чтобы создать учетные данные Firebase и войти в Firebase.
Firebase.Auth.Credential credential = Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null); 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 Sign In на платформах Apple вы можете столкнуться с ошибкой, что существующая учетная запись Firebase уже связана с учетной записью Apple. В этом случае вместо стандартного
Firebase.Auth.FirebaseAccountLinkException
будет выброшено исключениеFirebase.FirebaseException
. В этом случаеAuthResult.AdditionalInfo
включает свойствоUserInfo.UpdatedCredential
, которое, если оно допустимо, может использоваться для входа пользователя, связанного с Apple, черезFirebaseAuth.SignInAndRetrieveDataWithCredentialAsync
. Обновленные учетные данные позволяют избежать необходимости создавать новый токен Apple Sign-In с одноразовым номером для операции входа.auth.CurrentUser.LinkWithCredentialAsync( Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null)) .ContinueWithOnMainThread( task => { if (task.IsCompleted) { // 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 && task.Result.AdditionalUserInfo.UpdatedCredential.IsValid()) { // Attempt to sign in with the updated credential. auth.SignInAndRetrieveDataWithCredentialAsync(task.Result.AdditionalUserInfo.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 Notes
В отличие от других поставщиков, поддерживаемых Firebase Auth, Apple не предоставляет URL-адрес фотографии.
Кроме того, когда пользователь решает не делиться своей электронной почтой с приложением, Apple предоставляет уникальный адрес электронной почты для этого пользователя (в форме xyz@privaterelay.appleid.com
), который он использует совместно с вашим приложением. Если вы настроили частную службу ретрансляции электронной почты, Apple перенаправляет электронные письма, отправленные на анонимный адрес, на реальный адрес электронной почты пользователя.
Apple передает информацию о пользователе, такую как отображаемое имя, приложениям только при первом входе пользователя в систему. Обычно Firebase сохраняет отображаемое имя при первом входе пользователя в Apple, которое вы можете получить с помощью auth.CurrentUser.DisplayName
. Однако если вы ранее использовали Apple для входа пользователя в приложение без использования Firebase, Apple не предоставит Firebase отображаемое имя пользователя.
Следующие шаги
После того, как пользователь входит в систему в первый раз, создается новая учетная запись пользователя и связывается с учетными данными, т. е. с именем пользователя и паролем, номером телефона или информацией о поставщике проверки подлинности, с которыми пользователь вошел в систему. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя во всех приложениях вашего проекта, независимо от того, как пользователь входит в систему.В своих приложениях вы можете получить основную информацию о профиле пользователя из объекта Firebase.Auth.FirebaseUser. См. Управление пользователями .
В правилах безопасности Firebase Realtime Database и Cloud Storage вы можете получить уникальный идентификатор вошедшего пользователя из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.