Вы можете разрешить своим пользователям проходить аутентификацию в 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, вы можете оставить поля Service ID, Apple Team ID, секретный ключ и идентификатор ключа пустыми.
- Для поддержки на устройствах Android:
- Добавьте Firebase в свой проект Android . Обязательно зарегистрируйте подпись SHA-1 вашего приложения при настройке приложения в консоли Firebase .
- В консоли Firebase откройте раздел Auth . На вкладке «Метод входа» включите поставщика Apple . Укажите идентификатор службы, который вы создали в предыдущем разделе. Кроме того, в разделе конфигурации потока кода OAuth укажите свой Apple Team ID, а также закрытый ключ и идентификатор ключа, которые вы создали в предыдущем разделе.
Соблюдайте требования Apple к анонимным данным.
Вход с Apple дает пользователям возможность анонимизировать свои данные, включая адрес электронной почты, при входе в систему. Пользователи, выбравшие этот вариант, получают адреса электронной почты с доменом privaterelay.appleid.com
. Когда вы используете «Вход через Apple» в своем приложении, вы должны соблюдать все применимые политики или условия разработчиков Apple в отношении этих анонимных идентификаторов Apple ID.
Это включает в себя получение любого необходимого согласия пользователя, прежде чем вы свяжете любую личную информацию, непосредственно идентифицирующую вас, с анонимным Apple ID. При использовании аутентификации Firebase это может включать в себя следующие действия:
- Свяжите адрес электронной почты с анонимным Apple ID или наоборот.
- Привяжите номер телефона к анонимному Apple ID или наоборот.
- Свяжите неанонимные учетные данные социальных сетей (Facebook, Google и т. д.) с анонимным Apple ID или наоборот.
Приведенный выше список не является исчерпывающим. Ознакомьтесь с Лицензионным соглашением программы разработчиков 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 Package . Возможно, вам придется изменить код, чтобы перевести сгенерированную случайную строку nonce в состояние необработанной строки для использования в операциях Firebase (то есть сохранить ее копию до создания формы дайджеста SHA256 nonce).
Используйте полученную строку токена и необработанный одноразовый номер, чтобы создать учетные данные 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.FirebaseException
будет выброшеноFirebase.Auth.FirebaseAccountLinkException
. В этом случае исключение включает свойствоUserInfo.UpdatedCredential
, которое, если оно действительно, может использоваться для входа в систему пользователя, связанного с Apple, черезFirebaseAuth.SignInAndRetrieveDataWithCredentialAsync
. Обновленные учетные данные устраняют необходимость создания нового токена входа Apple с nonce для операции входа.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 с использованием объекта провайдера Auth. Обратите внимание, что в отличие от других операций 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 вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.