You can integrate Firebase Authentication with a custom authentication system by
modifying your authentication server to produce custom signed tokens when a user
successfully signs in. Your app receives this token and uses it to authenticate
with Firebase.
Before you begin
-
Create a Firebase project and register your app
if you haven't already.
-
Use Swift Package Manager to install and manage Firebase dependencies.
- In Xcode, with your app project open, navigate to
File > Add Packages
.
- When prompted, add the Firebase Apple platforms SDK repository:
https://github.com/firebase/firebase-ios-sdk.git
- Choose the Firebase Authentication library.
- Add the
-ObjC
flag to the
Other Linker Flags
section of your target's build settings.
-
When finished, Xcode will automatically begin resolving and downloading your
dependencies in the background.
- Get your project's server keys:
- Go to the
Service Accounts
page in your project's settings.
- Click
Generate New Private Key
at the bottom of the
Firebase Admin SDK
section of the
Service Accounts
page.
- The new service account's public/private key pair is automatically
saved on your computer. Copy this file to your authentication server.
Authenticate with Firebase
- Import the
FirebaseCore
module in your
UIApplicationDelegate
, as well as any other
Firebase modules
your app delegate uses.
For example, to use Cloud Firestore and Authentication:
SwiftUI
import SwiftUI
import FirebaseCore
import FirebaseFirestore
import FirebaseAuth
// ...
Swift
import FirebaseCore
import FirebaseFirestore
import FirebaseAuth
// ...
Objective-C
@import FirebaseCore;
@import FirebaseFirestore;
@import FirebaseAuth;
// ...
- Configure a
FirebaseApp
shared instance in your app delegate's
application(_:didFinishLaunchingWithOptions:)
method:
SwiftUI
// Use Firebase library to configure APIs
FirebaseApp.configure()
Swift
// Use Firebase library to configure APIs
FirebaseApp.configure()
Objective-C
// Use Firebase library to configure APIs
[FIRApp configure];
- If you're using SwiftUI, you must create an application delegate and attach it
to your
App
struct via
UIApplicationDelegateAdaptor
or
NSApplicationDelegateAdaptor
. You must also disable app delegate swizzling. For
more information, see the
SwiftUI instructions
.
SwiftUI
@main
struct YourApp: App {
// register app delegate for Firebase setup
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
var body: some Scene {
WindowGroup {
NavigationView {
ContentView()
}
}
}
}
- When users sign in to your app, send their sign-in credentials (for
example, their username and password) to your authentication server. Your
server checks the credentials and returns a
custom token
if they are valid.
- After you receive the custom token from your authentication server, pass it
to
signInWithCustomToken
to sign in the user:
Swift
Auth.auth().signIn(withCustomToken: customToken ?? "") { user, error in
// ...
}
Objective-C
[[FIRAuth auth] signInWithCustomToken:customToken
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
// ...
}];
Next steps
After a user signs in for the first time, a new user account is created and
linked to the credentials—that is, the user name and password, phone
number, or auth provider information—the user signed in with. This new
account is stored as part of your Firebase project, and can be used to identify
a user across every app in your project, regardless of how the user signs in.
-
In your apps, you can get the user's basic profile information from the
User
object. See
Manage Users
.
In your Firebase Realtime Database and Cloud Storage
Security Rules
, you can
get the signed-in user's unique user ID from the
auth
variable,
and use it to control what data a user can access.
You can allow users to sign in to your app using multiple authentication
providers by
linking auth provider credentials to an
existing user account.
To sign out a user, call
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;
}
You may also want to add error handling code for the full range of authentication
errors. See
Handle Errors
.