Buka konsol

Melakukan Autentikasi Menggunakan Login dengan Google di iOS

Anda dapat mengizinkan pengguna untuk melakukan autentikasi dengan Firebase menggunakan Akun Google miliknya dengan mengintegrasikan Login dengan Google ke dalam aplikasi Anda.

Sebelum memulai

  1. Tambahkan Firebase ke project iOS Anda. Sertakan pod berikut di Podfile Anda:
    pod 'Firebase/Auth'pod 'GoogleSignIn'
  2. Jika Anda belum menghubungkan aplikasi dengan project Firebase, lakukanlah dari Firebase console.
  3. Aktifkan Login dengan Google di Firebase console:
    1. Di Firebase console, buka bagian Auth.
    2. Di tab Metode login, aktifkan metode login dengan Google lalu klik Simpan.

1. Impor file header yang dibutuhkan

Pertama, Anda harus mengimpor file header Firebase SDK dan Google Sign-In SDK ke dalam aplikasi.

Swift

Dalam delegasi aplikasi, impor file header berikut:

import Firebaseimport GoogleSignIn

Dalam pengontrol tampilan login, impor file header berikut:

import Firebaseimport GoogleSignIn

Objective-C

Dalam delegasi aplikasi, impor file header berikut:

@import Firebase;@import GoogleSignIn;

Dalam pengontrol tampilan login, impor file header berikut:

@import Firebase;@import GoogleSignIn;

2. Implementasikan Login dengan Google

Implementasikan Login dengan Google dengan mengikuti langkah-langkah berikut. Lihat dokumentasi developer Login dengan Google untuk mengetahui detail penggunaan Login dengan Google pada iOS.

  1. Tambahkan skema URL khusus ke project Xcode Anda:
    1. Buka konfigurasi project, klik 2 kali pada nama project di tampilan struktur pohon sebelah kiri. Pilih aplikasi Anda dari bagian TARGET, lalu pilih tab Info, serta perluas bagian Jenis URL.
    2. Klik tombol +, lalu tambahkan skema URL untuk ID klien terbalik Anda. Untuk menemukan nilai ini, buka file konfigurasi GoogleService-Info.plist, lalu cari kunci REVERSED_CLIENT_ID. Salin nilai kunci tersebut, lalu tempel ke dalam kotak Skema URL pada halaman konfigurasi. Biarkan kolom lainnya kosong.

      Jika sudah selesai, konfigurasi akan terlihat seperti berikut (tapi dengan nilai khusus aplikasi Anda):

  2. Deklarasikan bahwa delegasi aplikasi mengimplementasikan protokol GIDSignInDelegate.

    Swift

    Pada AppDelegate.swift:
    class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {

    Objective-C

    Pada AppDelegate.h:
    @interface AppDelegate : UIResponder<UIApplicationDelegate, GIDSignInDelegate>
  3. Pada metode application:didFinishLaunchingWithOptions: delegasi aplikasi, konfigurasikan objek FirebaseApp, lalu atur delegasi login.

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()
    GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
    GIDSignIn.sharedInstance().delegate = self

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    [GIDSignIn sharedInstance].clientID = [FIRApp defaultApp].options.clientID;
    [GIDSignIn sharedInstance].delegate = self;
  4. Implementasikan metode application:openURL:options: dari delegasi aplikasi Anda. Metode tersebut harus memanggil metode handleURL pada instance GIDSignIn, yang akan menangani URL yang diterima aplikasi Anda di akhir proses autentikasi dengan benar.

    Swift

    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any])
      -> Bool {    return GIDSignIn.sharedInstance().handle(url,
                                sourceApplication:options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
                                annotation: [:])
    }

    Objective-C

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {  return [[GIDSignIn sharedInstance] handleURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }

    Agar aplikasi Anda berjalan di iOS 8 dan versi sebelumnya, implementasikan juga metode application:openURL:sourceApplication:annotation: yang sudah tidak digunakan lagi.

    Swift

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {    return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication: sourceApplication,
                                                 annotation: annotation)
    }
    

    Objective-C

    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {  return [[GIDSignIn sharedInstance] handleURL:url
                                 sourceApplication:sourceApplication
                                        annotation:annotation];
    }
    
  5. Pada delegasi aplikasi, implementasikan protokol GIDSignInDelegate untuk menangani proses login dengan menetapkan metode berikut:

    Objective-C

    - (void)signIn:(GIDSignIn *)signIn
    didSignInForUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      // ...
      if (error == nil) {
        GIDAuthentication *authentication = user.authentication;
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                         accessToken:authentication.accessToken];
        // ...
      } else {
        // ...
      }
    }
    - (void)signIn:(GIDSignIn *)signIn
    didDisconnectWithUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      // Perform any operations when the user disconnects from app here.
      // ...
    }
    

    Swift

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
      // ...
      if let error = error {
        // ...
        return
      }
    
      guard let authentication = user.authentication else { return }
      let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                        accessToken: authentication.accessToken)
      // ...
    }
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
        // Perform any operations when the user disconnects from app here.
        // ...
    }
    
  6. Deklarasikan bahwa pengontrol tampilan login Anda mengimplementasikan protokol GIDSignInUIDelegate.

    Swift

    Pada pengontrol tampilan:

    class MainViewController: UITableViewController {

    Objective-C

    Pada file header pengontrol tampilan:

    @interface MainViewController : UITableViewController
  7. Pada pengontrol tampilan, ganti metode viewDidLoad untuk menetapkan delegasi UI objek GIDSignIn, dan (opsional) untuk login secara diam-diam jika memungkinkan.

    Objective-C

    - (void)viewDidLoad {
      [super viewDidLoad];
    
    [GIDSignIn sharedInstance].presentingViewController = self;
    [[GIDSignIn sharedInstance] signIn];
      // TODO(developer) Configure the sign-in button look/feel
      // ...
    }
    

    Swift

    override func viewDidLoad() {
      super.viewDidLoad()
    
    GIDSignIn.sharedInstance()?.presentingViewController = self
    GIDSignIn.sharedInstance().signIn()
      // TODO(developer) Configure the sign-in button look/feel
      // ...
    }
    
  8. Tambahkan GIDSignInButton ke storyboard, file XIB, atau buat instance secara terprogram. Untuk menambah tombol ke papan cerita atau file XIB, tambahkan Tampilan dan setel kelas khususnya ke GIDSignInButton.
  9. Opsional: Jika Anda ingin menyesuaikan tombol, lakukan hal berikut:

    Swift

    1. Di pengontrol tampilan, deklarasikan tombol login sebagai properti.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. Hubungkan tombol ke properti signInButton yang baru saja Anda deklarasikan.
    3. Sesuaikan tombol dengan menyetel properti objek GIDSignInButton.

    Objective-C

    1. Dalam file header pengontrol tampilan, deklarasikan tombol login sebagai properti.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. Hubungkan tombol ke properti signInButton yang baru saja Anda deklarasikan.
    3. Sesuaikan tombol dengan menyetel properti objek GIDSignInButton.

3. Autentikasi dengan Firebase

Pada metode signIn:didSignInForUser:withError:, dapatkan token ID Google dan token akses Google dari objek GIDAuthentication, lalu tukarkan dengan kredensial Firebase:

Swift

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
  // ...
  if let error = error {
    // ...
    return
  }

  guard let authentication = user.authentication else { return }
  let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                    accessToken: authentication.accessToken)
  // ...
}

Objective-C

- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
  // ...
  if (error == nil) {
    GIDAuthentication *authentication = user.authentication;
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                     accessToken:authentication.accessToken];
    // ...
  } else {
    // ...
  }
}

Terakhir, lakukan autentikasi dengan Firebase menggunakan kredensial:

Swift

Auth.auth().signIn(with: credential) { (authResult, error) in
  if let error = error {
    // ...
    return
  }
  // User is signed in
  // ...
}

Objective-C

[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                       NSError * _Nullable error) {
  if (error) {
    // ...
    return;
  }
  // User successfully signed in. Get user data from the FIRUser object
  if (authResult == nil) { return; }
  FIRUser *user = authResult.user;
  // ...
}];

Langkah berikutnya

Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan dihubungkan ke kredensial, yaitu nama pengguna dan sandi, nomor telepon, atau informasi penyedia autentikasi, yang digunakan pengguna tersebut untuk login. Akun baru ini disimpan sebagai bagian dari project Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project Anda, terlepas dari cara pengguna login.

  • Pada aplikasi, Anda bisa memperoleh informasi profil dasar pengguna dari objek FIRUser. Baca bagian Mengelola Pengguna.

  • Dalam Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda dapat memperoleh ID unik milik pengguna yang login dari variabel auth, dan menggunakannya untuk mengontrol data yang dapat diakses pengguna.

Anda dapat mengizinkan pengguna untuk login ke aplikasi Anda menggunakan beberapa penyedia autentikasi dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada.

Agar pengguna logout, gunakan 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;
}

Mungkin Anda juga ingin menambahkan kode penanganan error untuk berbagai error autentikasi. Lihat Menangani Error.