Menambahkan Login dengan Google ke aplikasi iOS

1. Sebelum memulai

Codelab ini memandu Anda membuat aplikasi iOS yang menerapkan Login dengan Google dan berjalan di simulator. Implementasi menggunakan SwiftUI dan UIKit disediakan.

SwiftUI adalah framework UI modern Apple untuk pengembangan aplikasi baru. Framework ini memungkinkan pembuatan antarmuka pengguna untuk semua platform Apple dari satu codebase bersama. Aplikasi ini memerlukan versi minimum iOS 13.

UIKit adalah framework UI asli dan mendasar Apple untuk iOS. Library ini menyediakan kompatibilitas mundur untuk versi iOS yang lebih lama. Hal ini menjadikannya pilihan yang baik untuk aplikasi mapan yang perlu mendukung berbagai perangkat lama.

Anda dapat mengikuti jalur untuk framework yang paling sesuai dengan kebutuhan pengembangan Anda.

Prasyarat

Yang akan Anda pelajari

  • Cara membuat project Google Cloud
  • Cara membuat klien OAuth di Konsol Google Cloud
  • Cara menerapkan Login dengan Google untuk aplikasi iOS Anda
  • Cara menyesuaikan tombol Login dengan Google
  • Cara mendekode token ID
  • Cara mengaktifkan App Check untuk aplikasi iOS Anda

Yang Anda butuhkan

  • Xcode versi saat ini
  • Komputer yang menjalankan macOS yang memenuhi persyaratan sistem untuk versi Xcode yang telah Anda instal

Codelab ini dibuat menggunakan Xcode 16.3 dengan simulator iOS 18.3. Anda harus menggunakan Xcode versi terbaru untuk pengembangan.

2. Buat project Xcode baru

  1. Buka Xcode dan pilih Create a new Xcode project.
  2. Pilih tab iOS, pilih template App, lalu klik Next.

Halaman template pembuatan project Xcode

  1. Di opsi project:
    • Masukkan Nama Produk Anda.
    • Pilih Tim Anda secara opsional.
    • Masukkan ID Organisasi Anda.
    • Catat ID Paket yang dibuat. Anda akan membutuhkannya nanti.
    • Untuk Antarmuka, pilih salah satu:
      • SwiftUI untuk aplikasi berbasis SwiftUI.
      • Storyboard untuk aplikasi berbasis UIKit.
    • Pilih Swift untuk Bahasa.
    • Klik Berikutnya, lalu pilih lokasi untuk menyimpan project Anda.

Halaman opsi project Xcode

3. Buat klien OAuth

Untuk mengizinkan aplikasi Anda berkomunikasi dengan layanan autentikasi Google, Anda perlu membuat client ID OAuth. Hal ini memerlukan project Google Cloud. Langkah-langkah berikut akan memandu Anda melalui proses pembuatan project dan client ID OAuth.

Memilih atau membuat project Google Cloud

  1. Buka Konsol Google Cloud, lalu pilih atau buat project. Jika Anda memilih project yang sudah ada, konsol akan otomatis mengarahkan Anda ke langkah berikutnya yang diperlukan.

Halaman pemilih project Konsol Google Cloud

  1. Masukkan nama untuk project Google Cloud baru Anda.
  2. Pilih Create.

Halaman pemilih project Konsol Google Cloud

Jika sudah mengonfigurasi layar izin untuk project yang dipilih, Anda tidak akan diminta untuk mengonfigurasinya sekarang. Jika demikian, Anda dapat melewati bagian ini dan melanjutkan ke Membuat klien OAuth 2.0.

  1. Pilih Konfigurasi layar izin.

Halaman pembuatan klien OAuth di Konsol Google Cloud dengan persyaratan konfigurasi layar izin

  1. Pilih Mulai di halaman branding.

Halaman mulai menggunakan branding Konsol Google Cloud

  1. Di halaman konfigurasi project, isi kolom berikut:
    • Informasi Aplikasi: Masukkan nama dan email dukungan pengguna untuk aplikasi Anda. Email dukungan ini akan ditampilkan secara publik agar pengguna dapat menghubungi Anda jika ada pertanyaan tentang izin mereka.
    • Audiens: Pilih Eksternal.
    • Informasi Kontak: Masukkan alamat email agar Google dapat menghubungi Anda terkait project Anda.
    • Tinjau Layanan Google API: Kebijakan Data Pengguna.
    • Klik Buat.

Halaman konfigurasi branding klien Konsol Google Cloud

  1. Pilih halaman Klien di menu navigasi.
  2. Klik Buat Klien.

Halaman klien project Google Cloud

Buat klien OAuth 2.0

  1. Pilih iOS untuk Application type.
  2. Masukkan nama untuk klien Anda.
  3. Masukkan Bundle Identifier yang dibuat pada langkah terakhir.
  4. Masukkan ID Tim yang ditetapkan untuk tim Anda oleh Apple. Langkah ini bersifat opsional untuk saat ini, tetapi ID Tim diperlukan untuk mengaktifkan App Check nanti di codelab ini.
  5. Pilih Create.

Halaman input detail klien OAuth

  1. Salin Client ID dari jendela dialog, Anda akan memerlukannya nanti.
  2. Download file plist untuk dirujuk nanti.

Dialog ID klien OAuth dibuat

4. Mengonfigurasi project Xcode

Langkah berikutnya adalah menyiapkan project Xcode agar berfungsi dengan SDK Login dengan Google. Proses ini melibatkan penambahan SDK ke project Anda sebagai dependensi dan mengonfigurasi setelan project dengan ID klien unik. ID ini memungkinkan SDK berkomunikasi secara aman dengan layanan autentikasi Google selama proses login.

Menginstal dependensi Login dengan Google

  1. Buka project Xcode Anda.
  2. Buka File > Add Package Dependencies.
  3. Di kotak penelusuran, masukkan URL untuk repositori Login dengan Google: https://github.com/google/GoogleSignIn-iOS

Menemukan dependensi Login dengan Google di Swift Package Manager

  1. Pilih Tambahkan Paket.
  2. Pilih target aplikasi utama untuk paket GoogleSignIn.
  3. Jika Anda menggunakan SwiftUI, pilih target aplikasi utama untuk paket GoogleSignInSwift. Jika Anda berencana menggunakan UIKit, jangan pilih target untuk paket ini.
  4. Pilih Tambahkan Paket.

Menambahkan dependensi Login dengan Google ke project Anda

Mengonfigurasi kredensial aplikasi Anda

  1. Di Project Navigator, klik root project Anda.
  2. Di area editor utama, pilih target aplikasi utama Anda dari daftar TARGETS.
  3. Pilih tab Info di bagian atas area editor.
  4. Arahkan kursor ke baris terakhir di bagian Custom iOS Target Properties, lalu klik tombol + yang muncul.

Menambahkan kunci target baru ke properti target iOS

  1. Di kolom Key, ketik GIDClientID
  2. Di kolom Value, tempelkan client ID yang Anda salin dari Konsol Google Cloud.

Tambahkan GIDClientID ke target aplikasi utama

  1. Buka file plist yang Anda download dari Konsol Google Cloud.
  2. Salin nilai untuk Reversed Client ID.

File plist Google Cloud Console

  1. Perluas URL Types di bagian bawah tab Info.
  2. Pilih tombol +.
  3. Masukkan Reversed Client ID di kotak URL Schemes.

Menambahkan kunci URLSchemes ke target aplikasi utama

Sekarang kita siap mulai menambahkan tombol login ke aplikasi.

5. Menambahkan tombol login

Setelah project Xcode dikonfigurasi, saatnya mulai menambahkan tombol Login dengan Google ke aplikasi.

Logika inti untuk langkah ini adalah panggilan ke GIDSignIn.sharedInstance.signIn. Metode ini memulai proses autentikasi, menyerahkan kontrol ke SDK Login dengan Google untuk menampilkan alur Login dengan Google kepada pengguna.

SwiftUI

  1. Temukan file ContentView.swift di Xcode Project Navigator.
  2. Ganti konten file ini dengan teks berikut:
import GoogleSignIn
import GoogleSignInSwift
import SwiftUI

struct ContentView: View {
  var body: some View {
    VStack {
      GoogleSignInButton(action: handleSignInButton).padding()
    }
  }

  func handleSignInButton() {
    // Find the current window scene.
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
      print("There is no active window scene")
      return
    }

    // Get the root view controller from the window scene.
    guard
      let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
        .rootViewController
    else {
      print("There is no key window or root view controller")
      return
    }

    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(
      withPresenting: rootViewController
    ) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }
      // If sign in succeeded, display the app's main content View.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }
}

#Preview {
  ContentView()
}

Tombol Login dengan Google framework SwiftUI di simulator iOS

UIKit

  1. Temukan file ViewController.swift di Xcode Project Navigator.
  2. Ganti konten file ini dengan teks berikut:
import GoogleSignIn
import UIKit

class ViewController: UIViewController {

  // Create an instance of the Sign in with Google button
  let signInButton = GIDSignInButton()

  override func viewDidLoad() {
    super.viewDidLoad()

    // Add the sign-in button to your view
    view.addSubview(signInButton)

    // Position the button using constraints
    signInButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    ])

    // Add a target to the button to call a method when it's pressed
    signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)
  }

  // This method is called when the sign-in button is pressed.
  @objc func signInButtonTapped() {
    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      // If sign in succeeded, print the ID token.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }
}

Tombol Login dengan Google framework UIKit di simulator iOS

Melihat tombol login

Luncurkan aplikasi Anda di simulator. Anda akan melihat tombol Login dengan Google, tetapi tombol tersebut belum berfungsi dengan benar. Hal ini sudah diperkirakan, karena Anda masih perlu menerapkan kode untuk menangani pengalihan kembali ke aplikasi Anda setelah pengguna melakukan autentikasi.

6. Menyesuaikan tombol login

Anda dapat menyesuaikan tombol Login dengan Google default agar lebih sesuai dengan tema aplikasi Anda. SDK Login dengan Google memungkinkan Anda mengubah skema warna dan gaya tombol.

SwiftUI

Tombol default ditambahkan ke halaman dengan baris kode ini:

GoogleSignInButton(action: handleSignInButton)

GoogleSignInButton disesuaikan dengan meneruskan parameter ke inisialisasinya. Kode berikut akan membuat tombol login ditampilkan dalam mode gelap.

  1. Buka ContentView.swift
  2. Perbarui penginisialisasi untuk GoogleSignInButton agar berisi nilai berikut:
GoogleSignInButton(
  scheme: .dark,  // Options: .light, .dark, .auto
  style: .standard,  // Options: .standard, .wide, .icon
  state: .normal,  // Options: .normal, .disabled
  action: handleSignInButton
).padding()

Tombol Login dengan Google mode gelap Framework SwiftUI di simulator iOS

Untuk mengetahui informasi selengkapnya tentang opsi penyesuaian, lihat Referensi Framework GoogleSignInSwift

UIKit

Tombol default dibuat dengan baris kode berikut:

// Create an instance of the Sign in with Google button
let signInButton = GIDSignInButton()

// Add the button to your view
view.addSubview(signInButton)

GIDSignInButton disesuaikan dengan menyetel properti pada instance tombol. Kode berikut akan membuat tombol login ditampilkan dalam mode gelap.

  1. Buka ViewController.swift.
  2. Tambahkan baris kode berikut tepat sebelum menambahkan tombol login ke tampilan dalam fungsi viewDidLoad:
// Set the width and color of the sign-in button
signInButton.style = .standard  // Options: .standard, .wide, .iconOnly
signInButton.colorScheme = .dark  // Options: .dark, .light

Tombol Login dengan Google mode gelap framework UIKit di simulator iOS

Untuk mengetahui informasi selengkapnya tentang penyesuaian, lihat Referensi Framework GoogleSignIn

7. Menangani URL pengalihan autentikasi

Setelah tombol login ditambahkan, langkah selanjutnya adalah menangani pengalihan yang terjadi setelah pengguna melakukan autentikasi. Setelah autentikasi, Google akan menampilkan URL dengan kode otorisasi sementara. Untuk menyelesaikan proses login, pengendali mencegat URL ini dan meneruskannya ke SDK Login dengan Google untuk ditukar dengan token ID (JWT) yang ditandatangani.

SwiftUI

  1. Buka file yang berisi struct App Anda. File ini diberi nama berdasarkan project Anda, jadi namanya akan seperti YourProjectNameApp.swift.
  2. Ganti konten file ini dengan teks berikut:
import GoogleSignIn
import SwiftUI

@main
struct iOS_Sign_in_with_Google_App: App {
  var body: some Scene {
    WindowGroup {
      ContentView()

        .onOpenURL { url in
          GIDSignIn.sharedInstance.handle(url)
        }
    }
  }
}

UIKit

  1. Buka AppDelegate.swift.
  2. Tambahkan impor berikut ke bagian atas file:
import GoogleSignIn
  1. Tambahkan fungsi pengendali autentikasi berikut di dalam class AppDelegate. Tempat yang baik untuk menempatkannya adalah tepat setelah tanda kurung tutup metode application(_:didFinishLaunchingWithOptions:):
func application(
  _ app: UIApplication,
  open url: URL,
  options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
  var handled: Bool

  handled = GIDSignIn.sharedInstance.handle(url)
  if handled {
    return true
  }
  // If not handled by this app, return false.
  return false
}

Setelah melakukan perubahan ini, file AppDelegate.swift Anda akan terlihat seperti ini:

import GoogleSignIn
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    // Override point for customization after application launch.
    return true
  }

  func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey: Any] = [:]
  ) -> Bool {
    var handled: Bool

    handled = GIDSignIn.sharedInstance.handle(url)
    if handled {
      return true
    }
    // If not handled by this app, return false.
    return false
  }

  // MARK: UISceneSession Lifecycle

  func application(
    _ application: UIApplication,
    configurationForConnecting connectingSceneSession: UISceneSession,
    options: UIScene.ConnectionOptions
  ) -> UISceneConfiguration {
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return UISceneConfiguration(
      name: "Default Configuration",
      sessionRole: connectingSceneSession.role
    )
  }

  func application(
    _ application: UIApplication,
    didDiscardSceneSessions sceneSessions: Set<UISceneSession>
  ) {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
  }
}

Menguji alur login

Sekarang Anda dapat menguji alur login lengkap.

Jalankan aplikasi Anda dan ketuk tombol login. Setelah Anda melakukan autentikasi, Google akan menampilkan layar izin tempat Anda dapat memberikan izin bagi aplikasi untuk mengakses informasi Anda. Setelah Anda menyetujui, login akan diselesaikan, dan Anda akan kembali ke aplikasi.

Saat alur login berhasil diselesaikan, SDK Login dengan Google akan menyimpan kredensial pengguna dengan aman di Keychain perangkat. Kredensial ini dapat digunakan nanti untuk memungkinkan pengguna tetap login pada peluncuran aplikasi berikutnya.

8. Menambahkan tombol logout

Setelah login berfungsi, langkah berikutnya adalah menambahkan tombol logout dan memperbarui UI untuk mencerminkan status login pengguna saat ini. Saat login berhasil, SDK akan menyediakan objek GIDGoogleUser. Objek ini berisi properti profile dengan informasi dasar seperti nama dan email pengguna yang akan Anda gunakan untuk mempersonalisasi UI.

SwiftUI

  1. Buka file ContentView.swift Anda.
  2. Tambahkan variabel status di bagian atas struct ContentView Anda. Variabel ini akan menyimpan informasi pengguna setelah mereka login. Karena merupakan variabel @State, SwiftUI akan otomatis mengupdate UI Anda setiap kali nilainya berubah:
struct ContentView: View {
  @State private var user: GIDGoogleUser?
}
  1. Ganti body saat ini dari struct ContentView Anda dengan VStack berikut. Tindakan ini akan memeriksa apakah variabel status user berisi pengguna. Jika ya, halaman akan menampilkan pesan selamat datang dan tombol logout. Jika tidak, tombol Login dengan Google yang asli akan ditampilkan:
var body: some View {
  VStack {
    // Check if the user is signed in.
    if let user = user {
      // If signed in, show a welcome message and the sign-out button.
      Text("Hello, \(user.profile?.givenName ?? "User")!")
        .font(.title)
        .padding()

      Button("Sign Out", action: signOut)
        .buttonStyle(.borderedProminent)

    } else {
      // If not signed in, show the "Sign in with Google" button.
      GoogleSignInButton(
        scheme: .dark,  // Options: .light, .dark, .auto
        style: .standard,  // Options: .standard, .wide, .icon
        state: .normal,  // Options: .normal, .disabled
        action: handleSignInButton
      ).padding()
    }
  }
}
  1. Perbarui blok penyelesaian handleSignInButton untuk menetapkan signInResult.user ke variabel user baru Anda. Hal inilah yang memicu UI untuk beralih ke tampilan login:
func handleSignInButton() {
  // Find the current window scene.
  guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
    print("There is no active window scene")
    return
  }

  // Get the root view controller from the window scene.
  guard
    let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
      .rootViewController
  else {
    print("There is no key window or root view controller")
    return
  }

  // Start the sign-in process.
  GIDSignIn.sharedInstance.signIn(
    withPresenting: rootViewController
  ) { signInResult, error in
    guard let result = signInResult else {
      // Inspect error
      print("Error signing in: \(error?.localizedDescription ?? "No error description")")
      return
    }

    DispatchQueue.main.async {
      self.user = result.user
    }

    // If sign in succeeded, display the app's main content View.
    print("ID Token: \(result.user.idToken?.tokenString ?? "")")
  }
}
  1. Tambahkan fungsi signOut baru ke bagian bawah struct ContentView untuk dipanggil oleh tombol logout:
func signOut() {
  GIDSignIn.sharedInstance.signOut()
  // After signing out, set the `user` state variable to `nil`.
  self.user = nil
}

Luncurkan aplikasi dan login. Anda akan melihat perubahan UI setelah autentikasi berhasil.

Status login framework SwiftUI di simulator iOS

Setelah melakukan perubahan ini, file ContentView.swift Anda akan terlihat seperti ini:

import GoogleSignIn
import GoogleSignInSwift
import SwiftUI

struct ContentView: View {

  @State private var user: GIDGoogleUser?

  var body: some View {
    VStack {
      // Check if the user is signed in.
      if let user = user {
        // If signed in, show a welcome message and the sign-out button.
        Text("Hello, \(user.profile?.givenName ?? "User")!")
          .font(.title)
          .padding()

        Button("Sign Out", action: signOut)
          .buttonStyle(.borderedProminent)

      } else {
        // If not signed in, show the "Sign in with Google" button.
        GoogleSignInButton(
          scheme: .dark,  // Options: .light, .dark, .auto
          style: .standard,  // Options: .standard, .wide, .icon
          state: .normal,  // Options: .normal, .disabled
          action: handleSignInButton
        ).padding()
      }
    }
  }

  func handleSignInButton() {
    // Find the current window scene.
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
      print("There is no active window scene")
      return
    }

    // Get the root view controller from the window scene.
    guard
      let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
        .rootViewController
    else {
      print("There is no key window or root view controller")
      return
    }

    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(
      withPresenting: rootViewController
    ) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      DispatchQueue.main.async {
        self.user = result.user
      }

      // If sign in succeeded, display the app's main content View.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }

  func signOut() {
    GIDSignIn.sharedInstance.signOut()
    // After signing out, set the `user` state variable to `nil`.
    self.user = nil
  }
}

#Preview {
  ContentView()
}

UIKit

  1. Buka ViewController.swift.
  2. Di bagian atas ViewController, tepat di bawah tempat Anda mendeklarasikan signInButton, tambahkan tombol logout dan label selamat datang:
let signOutButton = UIButton(type: .system)
let welcomeLabel = UILabel()
  1. Tambahkan fungsi berikut ke bagian bawah ViewController. Fungsi ini akan menampilkan UI yang berbeda kepada pengguna berdasarkan status login mereka:
private func updateUI(for user: GIDGoogleUser?) {
  if let user = user {
    // User is signed in.
    signInButton.isHidden = true
    signOutButton.isHidden = false
    welcomeLabel.isHidden = false
    welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
  } else {
    // User is signed out.
    signInButton.isHidden = false
    signOutButton.isHidden = true
    welcomeLabel.isHidden = true
  }
}
  1. Di bagian bawah fungsi viewDidLoad, tambahkan kode berikut untuk menambahkan label selamat datang dan tombol logout ke tampilan:
// --- Set up the Welcome Label ---
welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
welcomeLabel.textAlignment = .center
welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
view.addSubview(welcomeLabel)

NSLayoutConstraint.activate([
  welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
  welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
])

// --- Set up the Sign-Out Button ---
signOutButton.translatesAutoresizingMaskIntoConstraints = false
signOutButton.setTitle("Sign Out", for: .normal)
view.addSubview(signOutButton)

NSLayoutConstraint.activate([
  signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
  signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
])

signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)

// --- Set Initial UI State ---
updateUI(for: nil)
  1. Perbarui fungsi signInButtonTapped untuk memanggil metode UpdateUI saat login berhasil:
@objc func signInButtonTapped() {
  // Start the sign-in process.
  GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
    guard let result = signInResult else {
      // Inspect error
      print("Error signing in: \(error?.localizedDescription ?? "No error description")")
      return
    }

    // If sign in succeeded, print the ID token.
    print("ID Token: \(result.user.idToken?.tokenString ?? "")")

    DispatchQueue.main.async {
      self.updateUI(for: result.user)
    }
  }
}
  1. Terakhir, tambahkan fungsi signOutButtonTapped ke ViewController untuk menangani proses logout:
@objc func signOutButtonTapped() {
  GIDSignIn.sharedInstance.signOut()
  // Update the UI for the signed-out state.
  updateUI(for: nil)
}

Luncurkan aplikasi dan login. Anda akan melihat perubahan UI setelah autentikasi berhasil.

Status login framework UIKit di simulator iOS

Setelah melakukan perubahan ini, file ViewController.swift Anda akan terlihat seperti ini:

import GoogleSignIn
import UIKit

class ViewController: UIViewController {

  // Create an instance of the Sign in with Google button
  let signInButton = GIDSignInButton()
  let signOutButton = UIButton(type: .system)
  let welcomeLabel = UILabel()

  override func viewDidLoad() {
    super.viewDidLoad()

    // Set the width and color of the sign-in button
    signInButton.style = .standard  // Options: .standard, .wide, .iconOnly
    signInButton.colorScheme = .dark  // Options: .dark, .light

    // Add the sign-in button to your view
    view.addSubview(signInButton)

    // Position the button using constraints
    signInButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    ])

    // Add a target to the button to call a method when it's pressed
    signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)

    // --- Set up the Welcome Label ---
    welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
    welcomeLabel.textAlignment = .center
    welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
    view.addSubview(welcomeLabel)

    NSLayoutConstraint.activate([
      welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
    ])

    // --- Set up the Sign-Out Button ---
    signOutButton.translatesAutoresizingMaskIntoConstraints = false
    signOutButton.setTitle("Sign Out", for: .normal)
    view.addSubview(signOutButton)

    NSLayoutConstraint.activate([
      signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
    ])

    signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)

    // --- Set Initial UI State ---
    updateUI(for: nil)
  }

  // This method is called when the sign-in button is pressed.
  @objc func signInButtonTapped() {
    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      // If sign in succeeded, print the ID token.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")

      DispatchQueue.main.async {
        self.updateUI(for: result.user)
      }
    }
  }

  private func updateUI(for user: GIDGoogleUser?) {
    if let user = user {
      // User is signed in.
      signInButton.isHidden = true
      signOutButton.isHidden = false
      welcomeLabel.isHidden = false
      welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
    } else {
      // User is signed out.
      signInButton.isHidden = false
      signOutButton.isHidden = true
      welcomeLabel.isHidden = true
    }
  }

  @objc func signOutButtonTapped() {
    GIDSignIn.sharedInstance.signOut()
    // Update the UI for the signed-out state.
    updateUI(for: nil)
  }
}

9. Memulihkan status login pengguna

Untuk meningkatkan pengalaman pengguna yang kembali, langkah berikutnya adalah memulihkan status login mereka saat aplikasi diluncurkan. Memanggil restorePreviousSignIn menggunakan kredensial yang disimpan di Keychain untuk login kembali pengguna secara diam-diam, sehingga memastikan mereka tidak harus menyelesaikan alur login setiap saat.

SwiftUI

  1. Buka ContentView.swift.
  2. Tambahkan kode berikut tepat setelah VStack di dalam variabel body:
.onAppear {
  // On appear, try to restore a previous sign-in.
  GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
    // This closure is called when the restoration is complete.
    if let user = user {
      // If a user was restored, update the `user` state variable.
      DispatchQueue.main.async {
        self.user = user
      }

      // Print the ID token to the console when restored.
      print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
    }
  }
}

ContentView.swift Anda akan terlihat seperti ini:

import GoogleSignIn
import GoogleSignInSwift
import SwiftUI

struct ContentView: View {

  @State private var user: GIDGoogleUser?

  var body: some View {
    VStack {
      // Check if the user is signed in.
      if let user = user {
        // If signed in, show a welcome message and the sign-out button.
        Text("Hello, \(user.profile?.givenName ?? "User")!")
          .font(.title)
          .padding()

        Button("Sign Out", action: signOut)
          .buttonStyle(.borderedProminent)

      } else {
        // If not signed in, show the "Sign in with Google" button.
        GoogleSignInButton(
          scheme: .dark,  // Options: .light, .dark, .auto
          style: .standard,  // Options: .standard, .wide, .icon
          state: .normal,  // Options: .normal, .disabled
          action: handleSignInButton
        ).padding()
      }
    }

    .onAppear {
      // On appear, try to restore a previous sign-in.
      GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
        // This closure is called when the restoration is complete.
        if let user = user {
          // If a user was restored, update the `user` state variable.
          DispatchQueue.main.async {
            self.user = user
          }

          // Print the ID token to the console when restored.
          print("Restored ID Token: \(user.idToken?.tokenString ?? "")")
        }
      }
    }
  }

  func handleSignInButton() {
    // Find the current window scene.
    guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else {
      print("There is no active window scene")
      return
    }

    // Get the root view controller from the window scene.
    guard
      let rootViewController = windowScene.windows.first(where: { $0.isKeyWindow })?
        .rootViewController
    else {
      print("There is no key window or root view controller")
      return
    }

    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(
      withPresenting: rootViewController
    ) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      DispatchQueue.main.async {
        self.user = result.user
      }

      // If sign in succeeded, display the app's main content View.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")
    }
  }

  func signOut() {
    GIDSignIn.sharedInstance.signOut()
    // After signing out, set the `user` state variable to `nil`.
    self.user = nil
  }
}

#Preview {
  ContentView()
}

UIKit

  1. Buka ViewController.swift.
  2. Tambahkan panggilan restorePreviousSignIn berikut di akhir metode viewDidLoad:
// Attempt to restore a previous sign-in session
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
  if let user = user {
    print("Successfully restored sign-in for user: \(user.profile?.givenName ?? "Unknown")")

    // Print the ID token when a session is restored.
    print("Restored ID Token: \(user.idToken?.tokenString ?? "")")

    // On success, update the UI for the signed-in state on the main thread.
    DispatchQueue.main.async {
      self.updateUI(for: user)
    }
  }
}

File ViewController.swift Anda akan terlihat seperti ini:

import GoogleSignIn
import UIKit

class ViewController: UIViewController {

  // Create an instance of the Sign in with Google button
  let signInButton = GIDSignInButton()
  let signOutButton = UIButton(type: .system)
  let welcomeLabel = UILabel()

  override func viewDidLoad() {
    super.viewDidLoad()

    // Set the width and color of the sign-in button
    signInButton.style = .standard  // Options: .standard, .wide, .iconOnly
    signInButton.colorScheme = .dark  // Options: .dark, .light

    // Add the sign-in button to your view
    view.addSubview(signInButton)

    // Position the button using constraints
    signInButton.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint.activate([
      signInButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signInButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
    ])

    // Add a target to the button to call a method when it's pressed
    signInButton.addTarget(self, action: #selector(signInButtonTapped), for: .touchUpInside)

    // --- Set up the Welcome Label ---
    welcomeLabel.translatesAutoresizingMaskIntoConstraints = false
    welcomeLabel.textAlignment = .center
    welcomeLabel.font = .systemFont(ofSize: 24, weight: .bold)
    view.addSubview(welcomeLabel)

    NSLayoutConstraint.activate([
      welcomeLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      welcomeLabel.bottomAnchor.constraint(equalTo: signInButton.topAnchor, constant: -20),
    ])

    // --- Set up the Sign-Out Button ---
    signOutButton.translatesAutoresizingMaskIntoConstraints = false
    signOutButton.setTitle("Sign Out", for: .normal)
    view.addSubview(signOutButton)

    NSLayoutConstraint.activate([
      signOutButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
      signOutButton.topAnchor.constraint(equalTo: signInButton.bottomAnchor, constant: 20),
    ])

    signOutButton.addTarget(self, action: #selector(signOutButtonTapped), for: .touchUpInside)

    // --- Set Initial UI State ---
    updateUI(for: nil)

    // Attempt to restore a previous sign-in session
    GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
      if let user = user {
        print("Successfully restored sign-in for user: \(user.profile?.givenName ?? "Unknown")")

        // Print the ID token when a session is restored.
        print("Restored ID Token: \(user.idToken?.tokenString ?? "")")

        // On success, update the UI for the signed-in state on the main thread.
        DispatchQueue.main.async {
          self.updateUI(for: user)
        }
      }
    }
  }

  // This method is called when the sign-in button is pressed.
  @objc func signInButtonTapped() {
    // Start the sign-in process.
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in
      guard let result = signInResult else {
        // Inspect error
        print("Error signing in: \(error?.localizedDescription ?? "No error description")")
        return
      }

      // If sign in succeeded, print the ID token.
      print("ID Token: \(result.user.idToken?.tokenString ?? "")")

      DispatchQueue.main.async {
        self.updateUI(for: result.user)
      }
    }
  }

  private func updateUI(for user: GIDGoogleUser?) {
    if let user = user {
      // User is signed in.
      signInButton.isHidden = true
      signOutButton.isHidden = false
      welcomeLabel.isHidden = false
      welcomeLabel.text = "Hello, \(user.profile?.givenName ?? "User")!"
    } else {
      // User is signed out.
      signInButton.isHidden = false
      signOutButton.isHidden = true
      welcomeLabel.isHidden = true
    }
  }

  @objc func signOutButtonTapped() {
    GIDSignIn.sharedInstance.signOut()
    // Update the UI for the signed-out state.
    updateUI(for: nil)
  }
}

Menguji login otomatis

Setelah login, keluar dari aplikasi sepenuhnya dan luncurkan lagi. Anda akan melihat bahwa Anda kini otomatis login tanpa perlu mengetuk tombol.

10. Memahami token ID

Meskipun objek GIDGoogleUser berguna untuk mempersonalisasi UI menggunakan nama dan email pengguna, bagian data terpenting yang ditampilkan dari SDK adalah token ID.

Codelab ini menggunakan alat online untuk memeriksa konten JWT. Di aplikasi produksi, Anda harus mengirim token ID ini ke server backend Anda. Server Anda harus memverifikasi integritas token ID dan menggunakan JWT untuk melakukan sesuatu yang lebih bermakna, seperti membuat akun baru di platform backend Anda atau membuat sesi baru untuk pengguna.

Mengakses dan mendekode token JWT

  1. Luncurkan aplikasi Anda.
  2. Buka konsol Xcode. Anda akan melihat Token ID yang dicetak. Tampilannya akan terlihat seperti eyJhbGciOiJSUzI1Ni ... Hecz6Wm4Q.
  3. Salin token ID dan gunakan alat online seperti jwt.io untuk mendekode JWT.

JWT yang didekode akan terlihat seperti ini:

{
  "alg": "RS256",
  "kid": "c8ab71530972bba20b49f78a09c9852c43ff9118",
  "typ": "JWT"
}
{
  "iss": "https://accounts.google.com",
  "azp": "171291171076-rrbkcjrp5jbte92ai9gub115ertscphi.apps.googleusercontent.com",
  "aud": "171291171076-rrbkcjrp5jbte92ai9gub115ertscphi.apps.googleusercontent.com",
  "sub": "10769150350006150715113082367",
  "email": "example@example.com",
  "email_verified": true,
  "at_hash": "JyCYDmHtzhjkb0-qJhKsMg",
  "name": "Kimya",
  "picture": "https://lh3.googleusercontent.com/a/ACg8ocIyy4VoR31t_n0biPVcScBHwZOCRaKVDb_MoaMYep65fyqoAw=s96-c",
  "given_name": "Kimya",
  "iat": 1758645896,
  "exp": 1758649496
}

Kolom token penting

Token ID yang didekode berisi kolom dengan tujuan yang berbeda. Meskipun beberapa di antaranya mudah dipahami, seperti nama dan email, yang lainnya digunakan oleh server backend Anda untuk verifikasi.

Kolom berikut sangat penting untuk dipahami:

  • sub: Kolom sub adalah ID unik dan permanen untuk Akun Google pengguna. Pengguna dapat mengubah email atau nama utamanya, tetapi ID sub-nya tidak akan pernah berubah. Hal ini menjadikan kolom sub sebagai nilai yang sempurna untuk digunakan sebagai kunci utama bagi akun pengguna backend Anda.

Mendapatkan informasi pengguna dari token ID memiliki informasi lebih lanjut tentang arti semua kolom token.

11. Mengamankan aplikasi Anda dengan App Check

Sebaiknya aktifkan App Check untuk memastikan hanya aplikasi Anda yang dapat mengakses endpoint OAuth 2.0 Google atas nama project Anda. App Check berfungsi dengan memverifikasi bahwa permintaan ke layanan backend Anda berasal dari aplikasi asli Anda di perangkat yang nyata dan tidak dimodifikasi.

Bagian ini menunjukkan cara mengintegrasikan App Check ke dalam aplikasi Anda dan mengonfigurasinya untuk proses debug di simulator dan untuk build produksi yang berjalan di perangkat sungguhan.

Penyiapan konsol

Mengintegrasikan App Check ke dalam aplikasi Anda memerlukan penyiapan satu kali di konsol Google Cloud dan Firebase. Hal ini mencakup mengaktifkan App Check untuk klien OAuth iOS Anda di Konsol Google Cloud, membuat Kunci API untuk digunakan dengan penyedia debug App Check, dan menautkan project Google Cloud Anda ke Firebase.

Aktifkan App Check di Konsol Google Cloud

  1. Buka daftar Klien yang terkait dengan project Google Cloud Anda.
  2. Pilih client ID OAuth 2.0 yang Anda buat untuk aplikasi iOS Anda.
  3. Aktifkan App Check di bagian Google Identity untuk iOS

Halaman pengeditan klien OAuth dengan tombol App Check

  1. Klik Simpan.

Membuat kunci API

  1. Buka halaman API Library untuk project Google Cloud Anda.
  2. Masukkan Firebase App Check API di kotak penelusuran.

Halaman library API Google Cloud Console

  1. Pilih dan aktifkan Firebase App Check API.
  2. Buka API & Layanan, lalu pilih Kredensial di menu navigasi.
  3. Pilih Buat kredensial di bagian atas halaman.

Halaman kredensial API Google Cloud Console

  1. Tetapkan nama untuk Kunci API ini.
  2. Pilih aplikasi iOS di bagian Pembatasan aplikasi.
  3. Tambahkan ID paket untuk aplikasi Anda sebagai aplikasi yang disetujui.
  4. Pilih Batasi kunci di bagian Pembatasan API.
  5. Pilih Firebase App Check API dari menu drop-down.
  6. Pilih Create.

Halaman pembuatan kunci API Google Cloud Console

  1. Salin kunci API yang dibuat. Anda akan membutuhkannya di langkah berikutnya.

Menambahkan Firebase ke project Google Cloud Anda

  1. Buka Firebase Console.
  2. Pilih Mulai dengan menyiapkan project Firebase.
  3. Pilih Add Firebase to Google Cloud project.

Menambahkan Firebase ke project Google Cloud yang ada

  1. Pilih project Google Cloud dari menu drop-down dan lanjutkan proses pendaftaran.
  2. Pilih Add Firebase.
  3. Setelah project Firebase Anda siap, pilih Continue untuk membuka project.

Integrasi kode sisi klien

Setelah project Google Cloud dikonfigurasi untuk App Check, saatnya menulis kode sisi klien untuk mengaktifkannya. Penyedia yang digunakan untuk pengesahan berbeda di lingkungan produksi dan debug. Aplikasi produksi di perangkat sungguhan menggunakan layanan App Attest bawaan Apple untuk membuktikan keasliannya. Namun, karena simulator iOS tidak dapat memberikan pengesahan semacam ini, lingkungan debug memerlukan penyedia debug khusus yang meneruskan kunci API.

Kode berikut menangani kedua skenario dengan menggunakan direktif compiler untuk memilih penyedia yang benar secara otomatis pada waktu build.

SwiftUI

  1. Buka file aplikasi utama.
  2. Tentukan class AppDelegate berikut setelah impor dan sebelum atribut @main:
class AppDelegate: NSObject, UIApplicationDelegate {
  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
  ) -> Bool {

    #if targetEnvironment(simulator)
      // Configure for debugging on a simulator.
      // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
      let apiKey = "YOUR_API_KEY"
      GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
        if let error {
          print("Error configuring GIDSignIn debug provider: \(error)")
        }
      }
    #else
      // Configure GIDSignIn for App Check on a real device.
      GIDSignIn.sharedInstance.configure { error in
        if let error {
          print("Error configuring GIDSignIn for App Check: \(error)")
        } else {
          print("GIDSignIn configured for App Check.")
        }
      }
    #endif

    return true
  }
}
  1. Ganti "YOUR_API_KEY" dalam kode yang diberikan dengan Kunci API yang Anda salin dari Konsol Google Cloud.
  2. Tambahkan baris berikut di dalam struct App, tepat sebelum variabel body. Hal ini mendaftarkan class AppDelegate Anda dengan siklus proses aplikasi, sehingga memungkinkan class tersebut merespons peluncuran aplikasi dan peristiwa sistem lainnya:
@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

File aplikasi utama Anda akan terlihat seperti ini:

import GoogleSignIn
import SwiftUI

class AppDelegate: NSObject, UIApplicationDelegate {
  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
  ) -> Bool {

    #if targetEnvironment(simulator)
      // Configure for debugging on a simulator.
      // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
      let apiKey = "YOUR_API_KEY"
      GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
        if let error {
          print("Error configuring GIDSignIn debug provider: \(error)")
        }
      }
    #else
      // Configure GIDSignIn for App Check on a real device.
      GIDSignIn.sharedInstance.configure { error in
        if let error {
          print("Error configuring GIDSignIn for App Check: \(error)")
        } else {
          print("GIDSignIn configured for App Check.")
        }
      }
    #endif

    return true
  }
}

@main
struct iOS_Sign_in_with_Google_App: App {

  @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate

  var body: some Scene {
    WindowGroup {
      ContentView()

        .onOpenURL { url in
          GIDSignIn.sharedInstance.handle(url)
        }
    }
  }
}

UIKit

  1. Buka AppDelegate.swift.
  2. Perbarui metode application(_:didFinishLaunchingWithOptions:) agar berisi inisialisasi App Check:
func application(
  _ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {

  #if targetEnvironment(simulator)
    // Configure for debugging on a simulator.
    // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
    let apiKey = "YOUR_API_KEY"
    GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
      if let error {
        print("Error configuring GIDSignIn debug provider: \(error)")
      }
    }
  #else
    // Configure GIDSignIn for App Check on a real device.
    GIDSignIn.sharedInstance.configure { error in
      if let error {
        print("Error configuring GIDSignIn for App Check: \(error)")
      }
    }
  #endif

  return true
}
  1. Ganti "YOUR_API_KEY" dalam kode yang diberikan dengan Kunci API yang Anda salin dari Konsol Google Cloud.

File AppDelegate.swift Anda akan terlihat seperti ini:

import GoogleSignIn
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

  func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {

    #if targetEnvironment(simulator)
      // Configure for debugging on a simulator.
      // TODO: Replace "YOUR_API_KEY" with the key from your Google Cloud project.
      let apiKey = "YOUR_API_KEY"
      GIDSignIn.sharedInstance.configureDebugProvider(withAPIKey: apiKey) { error in
        if let error {
          print("Error configuring GIDSignIn debug provider: \(error)")
        }
      }
    #else
      // Configure GIDSignIn for App Check on a real device.
      GIDSignIn.sharedInstance.configure { error in
        if let error {
          print("Error configuring GIDSignIn for App Check: \(error)")
        }
      }
    #endif

    return true
  }

  func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey: Any] = [:]
  ) -> Bool {
    var handled: Bool

    handled = GIDSignIn.sharedInstance.handle(url)
    if handled {
      return true
    }
    // If not handled by this app, return false.
    return false
  }

  // MARK: UISceneSession Lifecycle

  func application(
    _ application: UIApplication,
    configurationForConnecting connectingSceneSession: UISceneSession,
    options: UIScene.ConnectionOptions
  ) -> UISceneConfiguration {
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return UISceneConfiguration(
      name: "Default Configuration",
      sessionRole: connectingSceneSession.role
    )
  }

  func application(
    _ application: UIApplication,
    didDiscardSceneSessions sceneSessions: Set<UISceneSession>
  ) {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
  }
}

Menguji App Check di simulator

  1. Di Panel Menu Xcode, pilih Product > Scheme > Edit Scheme.
  2. Pilih Jalankan di menu navigasi.
  3. Pilih tab Arguments.
  4. Di bagian Arguments Passed on Launch, pilih + dan tambahkan -FIRDebugEnabled. Argumen peluncuran ini mengaktifkan logging debug Firebase.
  5. Pilih Tutup.

Halaman editor argumen Xcode

  1. Luncurkan aplikasi Anda di simulator.
  2. Salin token debug App Check yang dicetak di konsol Xcode.

Token debug App Check di konsol Xcode

  1. Buka project Anda di Firebase Console.
  2. Luaskan bagian Build di menu navigasi.
  3. Pilih Pemeriksaan Aplikasi.
  4. Pilih tab Aplikasi.
  5. Arahkan kursor ke aplikasi Anda, lalu pilih ikon menu tiga titik.

Setelan Firebase App Check

  1. Pilih Kelola token debug.
  2. Pilih Tambahkan token debug.
  3. Beri nama token debug Anda dan tempelkan token debug yang Anda salin sebelumnya untuk nilai.
  4. Pilih Simpan untuk mendaftarkan token Anda.

Pengelolaan token debug Firebase App Check

  1. Kembali ke simulator dan login.

Mungkin perlu waktu beberapa menit agar metrik muncul di konsol. Setelah mereka melakukannya, Anda dapat mengonfirmasi bahwa App Check berfungsi dengan mencari peningkatan permintaan Terverifikasi di salah satu dari dua tempat:

  • Di bagian App Check pada Konsol Firebase, di tab API.

Metrik Firebase App Check

  • Di halaman edit untuk klien OAuth Anda di Konsol Google Cloud.

Metrik App Check Google Cloud Console

Setelah memantau metrik App Check aplikasi dan mengonfirmasi bahwa permintaan yang sah sedang diverifikasi, Anda harus mengaktifkan penerapan App Check. Setelah diterapkan, App Check akan menolak semua permintaan yang tidak diverifikasi, sehingga hanya traffic dari aplikasi asli Anda yang dapat mengakses endpoint OAuth 2.0 Google atas nama project Anda.

12. Referensi lainnya

Selamat!

Anda telah mengonfigurasi klien OAuth 2.0 iOS, menambahkan tombol Login dengan Google ke aplikasi iOS, mempelajari cara menyesuaikan tampilan tombol, mendekode token ID JWT, dan mengaktifkan App Check untuk aplikasi Anda.

Link berikut dapat membantu Anda mengambil langkah berikutnya:

Pertanyaan umum (FAQ)