Lebih cepat ke konten

Pengaturan Login Google Supabase - Umum

GitHub

Panduan ini akan membantu Anda mengintegrasikan Sign-In Google dengan Supabase Authentication menggunakan plugin Login Sosial Capacitor. Konfigurasi ini memungkinkan Anda menggunakan Sign-In Google native pada platform mobile sambil memanfaatkan Supabase Auth untuk autentikasi backend.

Sebelum memulai, pastikan Anda telah:

  1. Membuat proyek Supabase

  2. Membaca context: Panduan gaya penulisan Capgo (Read The Style Guide) Pengaturan Umum Google Login

  3. panduan untuk mengatur kredit OAuth Google

  1. Pergi ke halaman Dashboard Supabase

  2. Klik pada proyek Anda

    Pemilih Proyek Supabase
  3. Perlukah ke menu Authentication menu

    Pengaturan Autentikasi Supabase
  4. Klik pada Providers tab

    Pengaturan Provider Supabase
  5. Cari Google provider

    Provider Google Supabase
  6. Aktifkan provider

    Provider Google Supabase Aktifkan
  7. Tambahkan ID klien untuk platform yang Anda rencanakan untuk digunakan

    Penyedia Supabase Google Tambah ID Klien
  8. Klik pada tombol Save tombol

    Penyimpanan Penyedia Supabase Google

Bagaimana Google Sign-In dengan Supabase Authentication Helper Bekerja

Penerapan Lengkap

Implementasi menghasilkan pasangan nonce yang aman berdasarkan persyaratan nonce Supabase Persyaratan nonce Supabase:

// Generate URL-safe random nonce
function getUrlSafeNonce(): string {
const array = new Uint8Array(32);
crypto.getRandomValues(array);
return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');
}
// Hash the nonce with SHA-256
async function sha256Hash(message: string): Promise<string> {
const encoder = new TextEncoder();
const data = encoder.encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
}
// Generate nonce pair
async function getNonce(): Promise<{ rawNonce: string; nonceDigest: string }> {
const rawNonce = getUrlSafeNonce();
const nonceDigest = await sha256Hash(rawNonce);
return { rawNonce, nonceDigest };
}

Alur:

  • rawNonce: String acak aman URL-nya (64 karakter hex)
  • nonceDigest: Hash SHA-256 dari rawNonce (dihex-encoding)
  • nonceDigest diarahkan ke Google Sign-In → Google menyertakan nonce digest dalam token ID
  • rawNonce diarahkan ke Supabase → Supabase menghash nonce mentah dan membandingkannya dengan nonce token

Fungsi ini menginisialisasi plugin dan melakukan sign-in dengan Google:

await SocialLogin.initialize({
google: {
webClientId: 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com',
// iOS only:
iOSClientId: 'YOUR_IOS_CLIENT_ID.apps.googleusercontent.com',
mode: 'online', // Required to get idToken
},
});
const response = await SocialLogin.login({
provider: 'google',
options: {
scopes: ['email', 'profile'],
nonce: nonceDigest, // Pass the SHA-256 hashed nonce
},
});

Sebelum mengirimkan token ke Supabase, implementasi melakukan validasi token JWT:

function validateJWTToken(idToken: string, expectedNonceDigest: string): { valid: boolean; error?: string } {
const decodedToken = decodeJWT(idToken);
// Check audience matches your Google Client IDs
const audience = decodedToken.aud;
if (!VALID_GOOGLE_CLIENT_IDS.includes(audience)) {
return { valid: false, error: 'Invalid audience' };
}
// Check nonce matches
const tokenNonce = decodedToken.nonce;
if (tokenNonce && tokenNonce !== expectedNonceDigest) {
return { valid: false, error: 'Nonce mismatch' };
}
return { valid: true };
}

Mengapa harus validasi sebelum Supabase?

Validasi token JWT sebelum mengirimkan token ke Supabase memiliki beberapa tujuan penting:

  1. Mencegah Permintaan Tidak Sah: Jika token memiliki audiens atau nonce yang salah, Supabase akan menolak token tersebut. Validasi terlebih dahulu menghindari panggilan API yang tidak perlu dan memberikan pesan kesalahan yang lebih jelas.

  2. Masalah Cache TokenOn beberapa platform (terutama iOS), Google Sign-In SDK dapat menyimpan token untuk meningkatkan kinerja. Ketika token yang disimpan dikembalikan, token yang disimpan mungkin telah dibuat dengan nonce yang berbeda (atau tidak ada nonce sama sekali), sehingga Supabase menolak token dengan pesan kesalahan "nonce mismatch". Dengan melakukan validasi sebelum mengirimkan ke Supabase, kita dapat mendeteksi masalah ini sebelumnya dan secara otomatis mencoba lagi dengan token yang segar.

  3. Keamanan (iOS): Pada iOS, validasi memastikan token dikeluarkan untuk ID Klien Google yang spesifik Anda, mencegah potensi masalah keamanan dari menggunakan token yang dimaksudkan untuk aplikasi lain.

  4. Penanganan Error yang Lebih Baik: Mendeteksi masalah sebelum Supabase memungkinkan logika ulang coba otomatis, yang sangat penting untuk menangani masalah caching iOS secara transparan.

Jika validasi gagal, fungsi otomatis:

  1. Keluar dari Google (membersihkan token yang disimpan - sangat kritis pada iOS)
  2. Ulang coba autentikasi sekali (memaksa pembuatan token segar dengan nonce yang benar)
  3. Jika ulang coba juga gagal, kembalikan pesan kesalahan

Terakhir, token yang telah diverifikasi dikirimkan ke Supabase:

const { data, error } = await supabase.auth.signInWithIdToken({
provider: 'google',
token: googleResponse.idToken,
nonce: rawNonce, // Pass the raw (unhashed) nonce
});

Implementasi lengkap tersedia di file aplikasi contoh, yang termasuk: file aplikasi contoh’s supabaseAuthUtils.ts yang mencakup:

  • getUrlSafeNonce() - Membuat URL-aman acak nonce
  • sha256Hash() - Menghash string dengan SHA-256
  • getNonce() - Membuat pasang nonce
  • decodeJWT() - Membuka token JWT
  • validateJWTToken() - Mengvalidasi audiens JWT dan nonce
  • authenticateWithGoogleSupabase() - Fungsi autentikasi utama dengan ulang coba otomatis

Bagian berjudul “Langkah Selanjutnya”

Teruskan dari Supabase Google Login - Pengaturan Umum

Judul Bagian “Teruskan dari Supabase Google Login - Pengaturan Umum”

Jika Anda menggunakan Supabase Google Login - Pengaturan Umum untuk merencanakan autentikasi dan alur akun, hubungkannya dengan Menggunakan @capgo/capacitor-login-social untuk kemampuan asli di Menggunakan @capgo/capacitor-login-social Menggunakan @capgo/capacitor-login-social untuk detail implementasi di @capgo/capacitor-login-social Menggunakan @capgo/capacitor-passkey untuk detail implementasi di @capgo/capacitor-passkey Menggunakan @capgo/capacitor-biometrik-asli untuk detail implementasi di @capgo/capacitor-native-biometric, dan Autentikasi Dua Faktor untuk detail implementasi di Autentikasi Dua Faktor.