Memproses login pengguna dengan SAML

Dokumen ini menunjukkan cara menggunakan Identity Platform untuk memproses login pengguna dengan penyedia Security Assertion Markup Language (SAML) 2.0.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  6. Aktifkan Identity Platform, dan tambahkan SDK Klien ke aplikasi Anda. Lihat Panduan Memulai untuk mempelajari caranya.

Mengonfigurasi penyedia

  1. Buka halaman Identity Provider di Konsol Google Cloud.
    Buka halaman Penyedia Identitas

  2. Klik Add a Provider, lalu pilih SAML dari daftar.

  3. Masukkan detail berikut:

    1. Nama penyedia. Nama ini dapat sama dengan ID penyedia, atau nama kustom. Jika Anda memasukkan nama kustom, klik Edit di samping ID Penyedia untuk menentukan ID (yang harus diawali dengan saml.).

    2. ID Entitas penyedia.

    3. URL SSO SAML penyedia.

    4. Sertifikat yang digunakan untuk penandatanganan token pada penyedia. Pastikan untuk menyertakan string awal dan akhir. Contoh:

      -----BEGIN CERTIFICATE-----
      MIICajCCAdOgAwIBAgIBADANBgkqhkiG9w0BAQ0FADBSMQswCQYDVQQGEwJ1czEL
      ...
      LEzc1JwEGQQVDYQCwsQMSBDAF0QAB0w9GikhqkgBNADABIgABIwAgOdACCjaCIIM
      -----END CERTIFICATE-----
      
  4. Di bagian Service provider, masukkan ID Entitas aplikasi Anda. ID ini biasanya adalah URL aplikasi Anda. Di penyedia identitas SAML, hal ini disebut sebagai audience.

  5. Tambahkan aplikasi Anda ke daftar Authorized Domains. Misalnya, jika URL login aplikasi Anda adalah https://example.com/login, tambahkan example.com.

  6. Jika perlu, sesuaikan URL callback untuk aplikasi Anda. URL ini biasanya disebut URL Assertion Consumer Service (ACS) oleh penyedia identitas SAML.

    Penggunaan URL callback default akan mengurangi kerumitan validasi respons SAML. Jika Anda menyesuaikan alur ini, pastikan URL callback Identity Platform untuk project Anda dikonfigurasi di penyedia identitas SAML. Nama ini biasanya terlihat seperti https://[PROJECT-ID].firebaseapp.com/__/auth/handler. Baca bagian Menyesuaikan pengendali autentikasi untuk mempelajari lebih lanjut.

  7. Klik Save.

Elemen wajib penyedia

Identity Platform mengharapkan elemen <saml:Subject> dan <saml:NameID> dalam respons dari penyedia. Jika Anda tidak menetapkan nilai untuk elemen tersebut saat mengonfigurasi penyedia, pernyataan SAML akan gagal.

Permintaan penandatanganan

Anda dapat meningkatkan keamanan permintaan autentikasi dengan menandatanganinya.

Untuk menandatangani permintaan, pertama-tama aktifkan permintaan bertanda tangan untuk penyedia identitas Anda dengan memanggil inboundSamlConfigs.patch(), dan menetapkan idp_config.sign_request ke true:

REST

Sebelum menggunakan salah satu data permintaan, lakukan penggantian berikut:

  • project-id: ID untuk project Google Cloud
  • provider-id: ID penyedia SAML

Metode HTTP dan URL:

PATCH https://identitytoolkit.googleapis.com/admin/v2/projects/project-id/inboundSamlConfigs/provider-id?updateMask=idpConfig.signRequest

Meminta isi JSON:

{
  "idp_config": {
    "sign_request": true
  }
}

Untuk mengirim permintaan Anda, perluas salah satu opsi berikut:

 

Anda harus menggunakan REST API untuk mengaktifkan permintaan yang ditandatangani. Penggunaan konsol Google Cloud atau Google Cloud CLI tidak didukung.

Responsnya adalah objek InboundSamlConfig, yang menyertakan array SpCertificate. Konfigurasikan nilai sertifikat X509 dengan penyedia identitas SAML agar Anda dapat memvalidasi tanda tangan permintaan Anda.

Pengguna sedang login

Saat Anda memproses login pengguna, Client SDK akan menangani handshake autentikasi, lalu menampilkan token ID yang berisi atribut SAML di payload-nya. Untuk memproses login pengguna dan mendapatkan atribut dari penyedia SAML:

  1. Buat instance SAMLAuthProvider dengan ID penyedia yang Anda konfigurasi di bagian sebelumnya. ID penyedia harus diawali dengan saml..

    Web versi 9

    import { SAMLAuthProvider } from "firebase/auth";
    
    const provider = new SAMLAuthProvider("saml.myProvider");

    Web versi 8

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');
  2. Mulai alur login. Anda dapat memilih untuk menggunakan pop-up atau pengalihan.

    Web versi 9

    import { SAMLAuthProvider } from "firebase/auth";
    
    const provider = new SAMLAuthProvider("saml.myProvider");

    Web versi 8

    const provider = new firebase.auth.SAMLAuthProvider('saml.myProvider');

    Pengalihan

    Untuk mengalihkan ke halaman login, panggil signInWithRedirect():

    Web versi 9

    import { getAuth, signInWithRedirect } from "firebase/auth";
    
    const auth = getAuth();
    signInWithRedirect(auth, provider);

    Web versi 8

    firebase.auth().signInWithRedirect(provider);

    Lalu, panggil getRedirectResult() untuk mendapatkan hasil saat pengguna kembali ke aplikasi Anda:

    Web versi 9

    import { getAuth, getRedirectResult, SAMLAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        // User is signed in.
        // Provider data available from the result.user.getIdToken()
        // or from result.user.providerData
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.customData.email;
        // The AuthCredential type that was used.
        const credential = SAMLAuthProvider.credentialFromError(error);
        // Handle / display error.
        // ...
      });

    Web versi 8

    firebase.auth().getRedirectResult()
      .then((result) => {
        // User is signed in.
        // Provider data available in result.additionalUserInfo.profile,
        // or from the user's ID token obtained from result.user.getIdToken()
        // as an object in the firebase.sign_in_attributes custom claim
        // This is also available from result.user.getIdTokenResult()
        // idTokenResult.claims.firebase.sign_in_attributes.
      }).catch((error) => {
        // Handle / display error.
        // ...
      });
  3. Ambil atribut pengguna yang terkait dengan penyedia SAML dari token ID menggunakan klaim firebase.sign_in_attributes. Pastikan untuk memverifikasi token ID menggunakan Admin SDK saat Anda mengirimkannya ke server.

    Token ID menyertakan alamat email pengguna hanya jika alamat tersebut diberikan dalam atribut NameID pernyataan SAML dari penyedia identitas:

    <Subject>
      <NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">test@email.com</NameID>
    </Subject>
    

    Ini diisi di token ID yang dikeluarkan Firebase dan di objek UserInfo.

Saat ini, hanya alur SAML yang dimulai penyedia layanan dari Client SDK yang didukung.

Menautkan akun pengguna

Jika pengguna telah login ke aplikasi Anda menggunakan metode lain (seperti email/sandi), Anda dapat menautkan akun mereka yang sudah ada ke penyedia SAML menggunakan linkWithPopup() atau linkWithRedirect(): Misalnya, kita dapat menautkan dengan Akun Google:

Web versi 9

import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth";
const provider = new GoogleAuthProvider();

const auth = getAuth();
linkWithPopup(auth.currentUser, provider).then((result) => {
  // Accounts successfully linked.
  const credential = GoogleAuthProvider.credentialFromResult(result);
  const user = result.user;
  // ...
}).catch((error) => {
  // Handle Errors here.
  // ...
});

Web versi 8

auth.currentUser.linkWithPopup(provider).then((result) => {
  // Accounts successfully linked.
  var credential = result.credential;
  var user = result.user;
  // ...
}).catch((error) => {
  // Handle Errors here.
  // ...
});

Langkah selanjutnya