Memproses login pengguna dengan GitHub

Dokumen ini menunjukkan cara menggunakan Identity Platform untuk memproses login pengguna dengan GitHub.

Sebelum memulai

Tutorial ini mengasumsikan bahwa Anda telah mengaktifkan Identity Platform, dan memiliki aplikasi web dasar yang ditulis menggunakan HTML dan JavaScript. Lihat Panduan memulai untuk mempelajari caranya.

Mengonfigurasi GitHub sebagai penyedia

Untuk mengonfigurasi GitHub sebagai penyedia identitas:

  1. Buka halaman Penyedia Identitas di konsol Google Cloud .

    Buka halaman Penyedia Identitas

  2. Klik Tambahkan Penyedia.

  3. Pilih GitHub dari daftar.

  4. Masukkan Client ID dan Client Secret GitHub Anda. Jika Anda belum memiliki ID dan secret, Anda dapat memperolehnya dari halaman GitHub Applications.

  5. Konfigurasi URI yang tercantum di bagian Configure GitHub sebagai URI pengalihan OAuth yang valid untuk aplikasi GitHub Anda. Jika Anda mengonfigurasi domain kustom di Identity Platform, perbarui URI pengalihan di konfigurasi aplikasi GitHub Anda untuk menggunakan domain kustom, bukan domain default. Misalnya, ubah https://myproject.firebaseapp.com/__/auth/handler menjadi https://auth.myownpersonaldomain.com/__/auth/handler.

  6. Daftarkan domain aplikasi Anda dengan mengklik Tambahkan Domain di bagian Authorized Domains. Untuk tujuan pengembangan, localhost sudah diaktifkan secara default.

  7. Di bagian bawah Konfigurasi aplikasi Anda, klik Detail Penyiapan. Salin cuplikan ke dalam kode aplikasi Anda untuk melakukan inisialisasi SDK klien Identity Platform.

  8. Klik Simpan.

Memproses login pengguna dengan SDK klien

  1. Buat instance objek penyedia GitHub:

    Web versi 9

    import { GithubAuthProvider } from "firebase/auth";
    
    const provider = new GithubAuthProvider();

    Web versi 8

    var provider = new firebase.auth.GithubAuthProvider();
  2. Opsional: Tambahkan cakupan OAuth. Cakupan menentukan data yang Anda minta dari GitHub. Data yang lebih sensitif mungkin memerlukan cakupan tertentu. Lihat dokumentasi penyedia untuk menentukan cakupan yang dibutuhkan aplikasi Anda.

    Web versi 9

    provider.addScope('repo');

    Web versi 8

    provider.addScope('repo');
  3. Opsional: Melokalkan alur autentikasi. Anda dapat menentukan bahasa, atau menggunakan bahasa default perangkat:

    Web versi 9

    import { getAuth } from "firebase/auth";
    
    const auth = getAuth();
    auth.languageCode = 'it';
    // To apply the default browser preference instead of explicitly setting it.
    // auth.useDeviceLanguage();

    Web versi 8

    firebase.auth().languageCode = 'it';
    // To apply the default browser preference instead of explicitly setting it.
    // firebase.auth().useDeviceLanguage();
  4. Opsional: Tentukan parameter OAuth kustom tambahan. Setelan ini khusus untuk GitHub, dan biasanya digunakan untuk menyesuaikan pengalaman autentikasi. Anda tidak dapat meneruskan parameter yang dicadangkan oleh OAuth atau Identity Platform.

    Web versi 9

    provider.setCustomParameters({
      'allow_signup': 'false'
    });

    Web versi 8

    provider.setCustomParameters({
      'allow_signup': 'false'
    });
  5. Gunakan objek penyedia GitHub untuk memproses login pengguna. Anda dapat membuka jendela pop-up, atau mengalihkan halaman saat ini. Pengalihan lebih mudah bagi pengguna di perangkat seluler.

    Untuk menampilkan pop-up, panggil signInWithPopup():

    Web versi 9

    import { getAuth, signInWithPopup, GithubAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    signInWithPopup(auth, provider)
      .then((result) => {
        // This gives you a GitHub Access Token. You can use it to access the GitHub API.
        const credential = GithubAuthProvider.credentialFromResult(result);
        const token = credential.accessToken;
    
        // The signed-in user info.
        const user = result.user;
        // IdP data available using getAdditionalUserInfo(result)
        // ...
      }).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 = GithubAuthProvider.credentialFromError(error);
        // ...
      });

    Web versi 8

    firebase
      .auth()
      .signInWithPopup(provider)
      .then((result) => {
        /** @type {firebase.auth.OAuthCredential} */
        var credential = result.credential;
    
        // This gives you a GitHub Access Token. You can use it to access the GitHub API.
        var token = credential.accessToken;
    
        // The signed-in user info.
        var user = result.user;
        // IdP data available in result.additionalUserInfo.profile.
          // ...
      }).catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        // The email of the user's account used.
        var email = error.email;
        // The firebase.auth.AuthCredential type that was used.
        var credential = error.credential;
        // ...
      });

    Untuk mengalihkan halaman, panggil signInWithRedirect() terlebih dahulu.

    Ikuti praktik terbaik saat menggunakan signInWithRedirect, linkWithRedirect, atau reauthenticateWithRedirect.

    Web versi 9

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

    Web versi 8

    firebase.auth().signInWithRedirect(provider);

    Kemudian, ambil token GitHub dengan memanggil getRedirectResult() saat halaman dimuat:

    Web versi 9

    import { getAuth, getRedirectResult, GithubAuthProvider } from "firebase/auth";
    
    const auth = getAuth();
    getRedirectResult(auth)
      .then((result) => {
        const credential = GithubAuthProvider.credentialFromResult(result);
        if (credential) {
          // This gives you a GitHub Access Token. You can use it to access the GitHub API.
          const token = credential.accessToken;
          // ...
        }
    
        // The signed-in user info.
        const user = result.user;
        // IdP data available using getAdditionalUserInfo(result)
        // ...
      }).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 = GithubAuthProvider.credentialFromError(error);
        // ...
      });

    Web versi 8

    firebase.auth()
      .getRedirectResult()
      .then((result) => {
        if (result.credential) {
          /** @type {firebase.auth.OAuthCredential} */
          var credential = result.credential;
    
          // This gives you a GitHub Access Token. You can use it to access the GitHub API.
          var token = credential.accessToken;
          // ...
        }
    
        // The signed-in user info.
        var user = result.user;
        // IdP data available in result.additionalUserInfo.profile.
          // ...
      }).catch((error) => {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
        // The email of the user's account used.
        var email = error.email;
        // The firebase.auth.AuthCredential type that was used.
        var credential = error.credential;
        // ...
      });

Setelah memiliki token akses, Anda dapat menggunakannya untuk memanggil GitHub API. Contoh:

REST

curl -H "Authorization: Bearer [TOKEN]" https://api.github.com/gists/starred

Memproses login pengguna secara manual

Jika tidak ingin menggunakan SDK klien, Anda juga dapat menangani alur login secara manual:

  1. Integrasikan autentikasi GitHub ke dalam aplikasi Anda dengan mengikuti langkah-langkah dalam dokumentasi developer mereka.

  2. Login pengguna dengan GitHub menggunakan alur yang Anda terapkan di langkah sebelumnya.

  3. Tukarkan token yang Anda terima dari GitHub dengan kredensial Identity Platform:

    Web versi 9

    import { GithubAuthProvider } from "firebase/auth";
    
    const credential = GithubAuthProvider.credential(token);

    Web versi 8

    var credential = firebase.auth.GithubAuthProvider.credential(token);
  4. Gunakan kredensial untuk memproses login pengguna dengan Identity Platform:

    Web versi 9

    import { getAuth, signInWithCredential } from "firebase/auth";
    
    // Sign in with the credential from the user.
    const auth = getAuth();
    signInWithCredential(auth, credential)
      .then((result) => {
        // Signed in 
        // ...
      })
      .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;
        // ...
      });

    Web versi 8

    // Sign in with the credential from the user.
    firebase.auth()
      .signInWithCredential(credential)
      .then((result) => {
        // Signed in 
        // ...
      })
      .catch((error) => {
        // Handle Errors here.
        const errorCode = error.code;
        const errorMessage = error.message;
        // The email of the user's account used.
        const email = error.email;
        // ...
      });

Langkah berikutnya