Вы можете разрешить пользователям выполнять аутентификацию в Firebase с помощью поставщиков OAuth, таких как GitHub. Для этого интегрируйте в приложение общий вход OAuth, используя Firebase SDK, чтобы реализовать сквозной процесс входа.
Подготовка
Чтобы пользователи могли входить в систему с помощью аккаунтов GitHub, сначала необходимо включить GitHub в качестве поставщика услуг входа для проекта Firebase:
Для установки зависимостей Firebase и управления ими используйте Swift Package Manager.
- Откройте проект приложения в Xcode и перейдите в меню File (Файл) > Add Packages (Добавить пакеты).
- Когда появится запрос, добавьте хранилище Firebase SDK для платформ Apple:
- Выберите библиотеку Firebase Authentication.
- Добавьте флаг
-ObjCв раздел Other Linker Flags (Другие флаги компоновщика) в настройках сборки целевого объекта. - После этого Xcode автоматически начнет распознавать и скачивать зависимости в фоновом режиме.
https://github.com/firebase/firebase-ios-sdk.git
Затем выполните настройку:
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Sign-in method (Способ входа) включите поставщика идентификационной информации GitHub.
-
Добавьте идентификатор клиента и секретный код клиента из консоли разработчика этого поставщика в конфигурацию поставщика:
- Зарегистрируйте свое приложение как приложение разработчика на GitHub и получите идентификатор клиента и секретный код клиента OAuth 2.0.
-
Убедитесь, что URI переадресации OAuth Firebase (например,
my-app-12345.firebaseapp.com/__/auth/handler) указан в качестве URL обратного вызова авторизации на странице настроек приложения в конфигурации приложения GitHub.
- Нажмите Сохранить.
Как настроить процесс входа с помощью Firebase SDK
Чтобы настроить вход с помощью Firebase SDK для платформ Apple, выполните следующие действия:
Добавьте специальные схемы URL в проект Xcode:
- Откройте конфигурацию проекта, дважды нажав на его название в дереве слева. Выберите приложение в разделе TARGETS (Цели), откройте вкладку Info (Информация) и разверните раздел URL Types (Типы URL).
-
Нажмите кнопку + и добавьте закодированный идентификатор приложения в качестве схемы URL.
Другие поля оставьте пустыми.
Закодированный идентификатор приложения можно найти в консоли Firebase. Для этого перейдите в раздел
Settings (Настройки) > General (Общие) и прокрутите страницу вниз до раздела Your apps (Ваши приложения), чтобы посмотреть сведения о приложении для iOS.После этого конфигурация должна выглядеть примерно так (но со значениями, относящимися к вашему приложению):
Создайте экземпляр OAuthProvider, используя идентификатор поставщика github.com.
Swift
var provider = OAuthProvider(providerID: "github.com")
Objective-C
FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
Необязательно. Укажите дополнительные специальные параметры OAuth, которые нужно отправить с запросом OAuth.
Swift
provider.customParameters = [ "allow_signup": "false" ]
Objective-C
[provider setCustomParameters:@{@"allow_signup": @"false"}];
Поддерживаемые параметры перечислены в документации по GitHub OAuth. Обратите внимание, что с помощью
setCustomParametersнельзя передавать обязательные параметры Firebase. Это параметры client_id, redirect_uri, response_type, scope и state.Необязательно. Укажите дополнительные области действия OAuth 2.0, помимо базового профиля, которые вы хотите запросить у поставщика аутентификации. Если вашему приложению требуется доступ к личным данным пользователей из GitHub API, вам нужно запросить разрешения на доступ к GitHub API в разделе API Permissions (Разрешения API) в консоли разработчика GitHub. Запрошенные области действия OAuth должны точно соответствовать областям, заданным в разрешениях API приложения.
Swift
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = ["user:email"]
Objective-C
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. [provider setScopes:@[@"user:email"]];
Дополнительную информацию можно найти в документации по областям действия GitHub.
Необязательно. Если вы хотите настроить, как приложение показывает
SFSafariViewControllerилиUIWebViewпри отображении reCAPTCHA пользователю, создайте пользовательский класс, соответствующий протоколуAuthUIDelegate, и передайте его вcredentialWithUIDelegate.Выполните аутентификацию в Firebase с помощью объекта поставщика OAuth.
Swift
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. guard let oauthCredential = authResult.credential as? OAuthCredential else { return } // GitHub OAuth access token can also be retrieved by: // oauthCredential.accessToken // GitHub OAuth ID token can be retrieved by calling: // oauthCredential.idToken } } }
Objective-C
[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. FIROAuthCredential *oauthCredential = (FIROAuthCredential *)authResult.credential; // GitHub OAuth access token can also be retrieved by: // oauthCredential.accessToken // GitHub OAuth ID token can be retrieved by calling: // oauthCredential.idToken }]; } }];
С помощью токена доступа OAuth вы можете вызвать GitHub API.
Например, чтобы получить основные данные профиля, вы можете вызвать REST API, передав токен доступа в заголовке
Authorization:https://api.github.com/user
Хотя в приведенных выше примерах основное внимание уделяется процессам входа, у вас также есть возможность связать поставщика GitHub с существующим пользователем. Например, вы можете связать несколько поставщиков с одним пользователем, чтобы он мог входить в систему с помощью любого из них.
Swift
Auth().currentUser.link(withCredential: credential) { authResult, error in if error != nil { // Handle error. } // GitHub credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // GitHub OAuth access token can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // GitHub OAuth ID token can be retrieved by calling: // (authResult.credential as? OAuthCredential)?.idToken }
Objective-C
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { // Handle error. } // GitHub credential is linked to the current user. // IdP data available in authResult.additionalUserInfo.profile. // GitHub OAuth access token is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // GitHub OAuth ID token can be retrieved by calling: // ((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 is can also be retrieved by: // (authResult.credential as? OAuthCredential)?.accessToken // GitHub OAuth ID token can be retrieved by calling: // (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 is can also be retrieved by: // ((FIROAuthCredential *)authResult.credential).accessToken // GitHub OAuth ID token can be retrieved by calling: // ((FIROAuthCredential *)authResult.credential).idToken }];
Дальнейшие действия
После первого входа пользователя создается новый аккаунт, который связывается с учетными данными, то есть именем пользователя и паролем, номером телефона или информацией от поставщика аутентификации, с помощью которых пользователь вошел в систему. Этот новый аккаунт сохраняется в проекте 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; }
Вы также можете добавить код обработки ошибок для всего диапазона ошибок аутентификации. Подробнее об обработке ошибок…