Peringatan: Data ini disediakan berdasarkan Kebijakan Data Pengguna Google . Harap tinjau dan patuhi kebijakan. Kegagalan untuk melakukannya dapat mengakibatkan penangguhan proyek atau akun.

Bermigrasi ke Layanan Google Identity

Ringkasan

Untuk mendapatkan token akses per pengguna untuk memanggil Google API, Google menawarkan beberapa library JavaScript:

Panduan ini memberikan petunjuk untuk bermigrasi dari library ini ke library Layanan Identitas Google.

Dengan mengikuti panduan ini, Anda akan:

  • mengganti Library Platform yang tidak digunakan lagi dengan library Identity Services, dan
  • Jika menggunakan Library Klien API, hapus modul gapi.auth2 yang tidak digunakan lagi, metode dan objeknya, lalu ganti dengan yang setara dengan Layanan Identitas.

Untuk deskripsi tentang apa saja yang berubah dengan library JavaScript Layanan Identitas, baca ringkasan dan cara kerja otorisasi pengguna untuk meninjau istilah dan konsep utama.

Jika Anda mencari autentikasi untuk pendaftaran dan login pengguna, lihat Melakukan migrasi dari Login dengan Google.

Mengidentifikasi alur otorisasi

Ada dua kemungkinan alur otorisasi pengguna: kode otorisasi dan implisit.

Tinjau aplikasi web Anda untuk mengidentifikasi jenis alur otorisasi yang saat ini digunakan.

Indikasi aplikasi web Anda menggunakan alur implisit:

  • Aplikasi web Anda murni berbasis browser, tanpa platform backend.
  • Pengguna harus ada untuk memanggil Google API, aplikasi Anda hanya menggunakan token akses, dan tidak memerlukan token refresh.
  • Aplikasi web Anda memuat apis.google.com/js/api.js.
  • Penerapan Anda didasarkan pada OAuth 2.0 untuk Aplikasi Web Sisi Klien.
  • Aplikasi Anda menggunakan modul gapi.client atau gapi.auth2 yang ada di Library Klien Google API untuk JavaScript.

Indikasi aplikasi web Anda menggunakan alur kode otorisasi:

  • Penerapan Anda didasarkan pada:

  • Aplikasi Anda dijalankan di browser pengguna dan di platform backend.

  • Platform backend Anda menghosting endpoint kode otorisasi.

  • Platform backend Anda memanggil Google API atas nama pengguna tanpa mengharuskan mereka untuk melakukannya, juga dikenal sebagai mode offline.

  • Token refresh dikelola dan disimpan oleh platform backend Anda.

Dalam beberapa kasus, codebase Anda mungkin mendukung kedua flow tersebut.

Memilih alur otorisasi

Sebelum memulai migrasi, Anda perlu menentukan apakah melanjutkan dengan alur yang ada atau mengadopsi alur yang berbeda paling sesuai dengan kebutuhan Anda.

Tinjau memilih alur otorisasi untuk memahami perbedaan dan konsekuensi utama antara kedua alur.

Biasanya, alur kode otorisasi direkomendasikan karena menawarkan tingkat keamanan pengguna tertinggi. Dengan menerapkan alur ini, platform Anda juga dapat lebih mudah menambahkan fungsi offline baru, seperti mengambil update, untuk memberi tahu pengguna tentang perubahan penting pada kalender, foto, langganan, dan sebagainya.

Pilih alur otorisasi menggunakan pemilih di bawah ini.

Alur Implisit

Dapatkan token akses untuk penggunaan dalam browser saat pengguna ada.

Contoh alur implisit menunjukkan aplikasi web sebelum dan sesudah migrasi ke Layanan Identitas.

Alur kode otorisasi

Kode otorisasi per pengguna yang dikeluarkan oleh Google dikirimkan ke platform backend Anda, tempat kode tersebut kemudian ditukar dengan token akses dan token refresh.

Contoh alur kode otorisasi menampilkan aplikasi web sebelum dan sesudah migrasi ke Layanan Identitas.

Dalam panduan ini, ikuti petunjuk yang tercantum dalam huruf tebal untuk menambahkan Add, Remove, Update, atau Replace.

Perubahan pada aplikasi web dalam browser

Bagian ini meninjau perubahan yang akan Anda lakukan pada aplikasi web dalam browser saat bermigrasi ke library JavaScript Layanan Identitas Google.

Mengidentifikasi kode dan pengujian yang terpengaruh

Cookie debug dapat membantu menemukan kode yang terpengaruh dan menguji perilaku pasca-penghentian.

Dalam aplikasi besar atau kompleks, mungkin akan sulit untuk menemukan semua kode yang terpengaruh oleh penghentian modul gapi.auth2. Untuk mencatat log penggunaan yang akan segera dihentikan fungsinya ke konsol, tetapkan nilai cookie G_AUTH2_MIGRATION ke informational. Secara opsional, tambahkan titik dua diikuti dengan nilai kunci untuk juga mencatat ke penyimpanan sesi. Setelah login dan penerimaan kredensial, tinjau atau kirim log yang dikumpulkan ke backend untuk analisis nanti. Misalnya, informational:showauth2use menyimpan asal dan URL ke kunci penyimpanan sesi yang bernama showauth2use.

Untuk memverifikasi perilaku aplikasi saat modul gapi.auth2 tidak lagi dimuat, tetapkan nilai cookie G_AUTH2_MIGRATION ke enforced. Dengan demikian, pengujian perilaku pasca-penghentian dapat dilakukan sebelum tanggal penegakan.

Kemungkinan nilai cookie G_AUTH2_MIGRATION:

  • enforced Jangan memuat modul gapi.auth2.
  • informational Mencatat penggunaan fungsionalitas yang tidak digunakan lagi ke konsol JS. Selain itu, catat ke penyimpanan sesi saat nama kunci opsional ditetapkan: informational:key-name.

Untuk meminimalkan dampak terhadap pengguna, sebaiknya setel cookie ini secara lokal selama pengembangan dan pengujian, sebelum menggunakannya di lingkungan produksi.

Library dan modul

Modul gapi.auth2 mengelola autentikasi pengguna untuk login dan alur implisit untuk otorisasi, mengganti modul yang tidak digunakan lagi ini, serta objek dan metodenya dengan library Layanan Identitas Google.

Tambahkan library Layanan Identitas ke aplikasi web Anda dengan menyertakannya dalam dokumen:

<script src="https://accounts.google.com/gsi/client" async defer></script>

Hapus semua instance pemuatan modul auth2 menggunakan gapi.load('auth2', function).

Library Layanan Identitas Google menggantikan penggunaan modul gapi.auth2. Anda dapat terus menggunakan modul gapi.client dengan aman dari Library Klien Google API untuk JavaScript, dan memanfaatkan pembuatan metode JS callable otomatis dari dokumen penemuan, batch beberapa panggilan API, dan fungsi pengelolaan CORS.

Cookie

Otorisasi pengguna tidak memerlukan penggunaan cookie.

Lihat Bermigrasi dari Login dengan Google untuk mengetahui detail tentang cara autentikasi pengguna menggunakan cookie, dan Cara Google menggunakan cookie untuk penggunaan cookie oleh produk dan layanan Google lainnya.

Kredensial

Layanan Identitas Google memisahkan autentikasi dan otorisasi pengguna menjadi dua operasi yang berbeda, dan kredensial pengguna terpisah: token ID yang digunakan untuk mengidentifikasi pengguna ditampilkan secara terpisah dari token akses yang digunakan untuk otorisasi.

Untuk melihat perubahan ini, lihat kredensial contoh.

Alur Implisit

Pisahkan autentikasi dan otorisasi pengguna dengan menghapus penanganan profil pengguna dari alur otorisasi.

Hapus referensi klien JavaScript Login dengan Google berikut:

Metode

  • GoogleUser.getBasicProfile()
  • GoogleUser.getId()

Alur kode otorisasi

Layanan Identitas memisahkan kredensial dalam browser menjadi token ID dan token akses. Perubahan ini tidak berlaku untuk kredensial yang diperoleh melalui panggilan langsung ke endpoint Google OAuth 2.0 dari platform backend Anda atau melalui library yang berjalan di server aman pada platform Anda seperti Klien Node.js Google API.

Status sesi

Sebelumnya, Login dengan Google membantu Anda mengelola status login pengguna menggunakan:

Anda bertanggung jawab untuk mengelola status login dan sesi pengguna di aplikasi web Anda.

Hapus referensi klien JavaScript Login dengan Google berikut:

Objek:

  • gapi.auth2.SignInOptions

Metode:

  • GoogleAuth.attachClickHandler()
  • GoogleAuth.isSignedIn()
  • GoogleAuth.isSignedIn.get()
  • GoogleAuth.isSignedIn.listen()
  • GoogleAuth.signIn()
  • GoogleAuth.signOut()
  • GoogleAuth.currentUser.get()
  • GoogleAuth.currentUser.listen()
  • GoogleUser.isSignedIn()

Konfigurasi klien

Update aplikasi web Anda untuk menginisialisasi klien token untuk alur kode otorisasi atau implisit.

Hapus referensi klien JavaScript Login dengan Google berikut:

Objek:

  • gapi.auth2.ClientConfig
  • gapi.auth2.OfflineAccessOptions

Metode:

  • gapi.auth2.getAuthInstance()
  • GoogleUser.grant()

Alur Implisit

Tambahkan objek TokenClientConfig dan panggilan initTokenClient() untuk mengonfigurasi aplikasi web Anda, dengan mengikuti contoh dalam menginisialisasi klien token.

Ganti Referensi klien JavaScript Login dengan Google dengan Layanan Identitas Google:

Objek:

  • gapi.auth2.AuthorizeConfig dengan TokenClientConfig

Metode:

  • gapi.auth2.init() dengan google.accounts.oauth2.initTokenClient()

Parameter:

  • gapi.auth2.AuthorizeConfig.login_hint dengan TokenClientConfig.hint.
  • gapi.auth2.GoogleUser.getHostedDomain() dengan TokenClientConfig.hosted_domain.

Alur kode otorisasi

Tambahkan objek CodeClientConfig dan panggilan initCodeClient() untuk mengonfigurasi aplikasi web Anda, dengan mengikuti contoh dalam menginisialisasi Klien Kode.

Saat beralih dari alur kode implisit ke alur otorisasi:

Menghapus Referensi klien JavaScript Login dengan Google

Objek:

  • gapi.auth2.AuthorizeConfig

Metode:

  • gapi.auth2.init()

Parameter:

  • gapi.auth2.AuthorizeConfig.login_hint
  • gapi.auth2.GoogleUser.getHostedDomain()

Permintaan token

Gestur pengguna, seperti klik tombol, menghasilkan permintaan yang menghasilkan token akses yang ditampilkan langsung ke browser pengguna dengan alur implisit, atau ke platform backend Anda setelah menukar kode otorisasi per pengguna untuk token akses dan token refresh.

Alur Implisit

Token akses dapat diperoleh dan digunakan di browser saat pengguna login dan memiliki sesi aktif dengan Google. Untuk mode implisit, gestur pengguna diperlukan untuk meminta token akses, meskipun ada permintaan sebelumnya.

Ganti Referensi klien JavaScript Login dengan Google: dengan Layanan Identitas Google:

Metode:

  • gapi.auth2.authorize() dengan TokenClient.requestAccessToken()
  • GoogleUser.reloadAuthResponse() dengan TokenClient.requestAccessToken()

Tambahkan link atau tombol untuk memanggil requestAccessToken() guna memulai alur UX pop-up untuk meminta token akses, atau untuk mendapatkan token baru saat token yang ada berakhir.

Perbarui codebase Anda untuk:

  • Picu alur token OAuth 2.0 dengan requestAccessToken().
  • Mendukung otorisasi inkremental dengan menggunakan requestAccessToken dan OverridableTokenClientConfig untuk memisahkan satu permintaan untuk banyak cakupan menjadi beberapa permintaan yang lebih kecil.
  • Meminta token baru jika token yang ada sudah tidak berlaku, atau dicabut.

Bekerja dengan beberapa cakupan mungkin memerlukan perubahan struktural pada codebase untuk meminta akses ke cakupan hanya saat dibutuhkan, bukan sekaligus, hal ini dikenal sebagai otorisasi inkremental. Setiap permintaan harus berisi sesedikit mungkin cakupan, dan idealnya satu cakupan. Lihat cara menangani izin pengguna untuk mengetahui lebih lanjut cara mengupdate aplikasi untuk otorisasi inkremental.

Saat masa berlaku token akses berakhir, modul gapi.auth2 secara otomatis mendapatkan token akses baru yang valid untuk aplikasi web Anda. Untuk meningkatkan keamanan pengguna, proses refresh token otomatis ini tidak didukung oleh library Layanan Google Identity. Aplikasi web Anda harus diupdate untuk mendeteksi token akses yang sudah tidak berlaku dan meminta token baru. Lihat bagian Penanganan token di bawah untuk mengetahui informasi selengkapnya.

Alur kode otorisasi

Tambahkan link atau tombol untuk memanggil requestCode() guna meminta kode otorisasi dari Google. Sebagai contoh, lihat Memicu Alur Kode OAuth 2.0.

Baca bagian penanganan Token di bawah untuk mengetahui informasi selengkapnya tentang cara merespons token akses yang habis masa berlakunya atau dicabut.

Penanganan token

Penanganan error Add untuk mendeteksi panggilan Google API yang gagal saat token akses yang sudah tidak berlaku atau dicabut akan digunakan, dan untuk meminta token akses yang baru dan valid.

Kode status HTTP pesan error 401 Unauthorized dan invalid_token ditampilkan oleh Google API saat token akses yang masa berlakunya sudah berakhir atau dicabut akan digunakan. Untuk contoh, lihat Respons token tidak valid.

Masa berlaku token habis

Token akses berumur pendek, dan sering kali hanya valid selama beberapa menit.

Pencabutan token

Pemilik Akun Google dapat mencabut izin yang diberikan sebelumnya kapan saja. Tindakan ini akan membatalkan token akses dan token refresh yang ada. Pencabutan dapat dipicu dari platform Anda menggunakan revoke() atau melalui Akun Google.

Ganti Referensi klien JavaScript Login dengan Google: dengan Layanan Identitas Google:

Metode:

  • getAuthInstance().disconnect() dengan google.accounts.oauth2.revoke()
  • GoogleUser.disconnect() dengan google.accounts.oauth2.revoke()

Panggil revoke saat pengguna menghapus akunnya di platform Anda, atau ingin menghapus izin untuk membagikan data ke aplikasi Anda.

Google menampilkan dialog izin kepada pengguna saat aplikasi web atau platform backend Anda meminta token akses. Lihat contoh dialog izin yang ditampilkan oleh Google kepada pengguna.

Sebelum mengeluarkan token akses ke aplikasi, sesi Google yang ada dan aktif diperlukan untuk meminta izin pengguna dan mencatat hasilnya. Pengguna mungkin diwajibkan untuk login ke Akun Google jika sesi yang sudah ada belum dibuat.

Login pengguna

Pengguna dapat login ke Akun Google di tab browser terpisah, atau secara native melalui browser atau sistem operasi. Sebaiknya tambahkan Sign In With Google ke situs Anda untuk membuat sesi aktif antara Akun Google dan browser saat pengguna pertama kali membuka aplikasi Anda. Tindakan ini menawarkan manfaat berikut:

  • Meminimalkan jumlah login pengguna yang meminta token akses untuk memulai proses login Akun Google jika sesi yang aktif belum ada.
  • Gunakan kolom kredensial email token ID JWT secara langsung sebagai nilai parameter hint dalam objek CodeClientConfig atau TokenClientConfig. Hal ini sangat membantu jika platform Anda tidak mengelola sistem pengelolaan akun pengguna.
  • Cari dan kaitkan Akun Google dengan akun pengguna lokal yang ada pada platform, sehingga membantu meminimalkan akun duplikat di platform Anda.
  • Ketika akun lokal baru dibuat, dialog dan alur pendaftaran Anda dapat dipisahkan dengan jelas dari dialog dan alur autentikasi pengguna, sehingga mengurangi jumlah langkah yang diperlukan dan meningkatkan rasio batal.

Setelah login dan sebelum token akses dikeluarkan, pengguna harus memberikan izin untuk aplikasi Anda untuk cakupan yang diminta.

Setelah izin diberikan, token akses ditampilkan bersama dengan daftar cakupan yang disetujui atau ditolak oleh pengguna.

Izin terperinci memungkinkan pengguna menyetujui atau menolak masing-masing cakupan. Saat meminta akses ke beberapa cakupan, setiap cakupan diberikan atau ditolak secara terpisah dari cakupan lainnya. Berdasarkan pilihan pengguna, aplikasi Anda secara selektif mengaktifkan fitur dan fungsi yang bergantung pada cakupan individual.

Alur Implisit

Ganti Referensi klien JavaScript Login dengan Google dengan Layanan Identitas Google:

Objek:

  • gapi.auth2.AuthorizeResponse dengan TokenClient.TokenResponse
  • gapi.auth2.AuthResponse dengan TokenClient.TokenResponse

Metode:

  • GoogleUser.hasGrantedScopes() dengan google.accounts.oauth2.hasGrantedAllScopes()
  • GoogleUser.getGrantedScopes() dengan google.accounts.oauth2.hasGrantedAllScopes()

Hapus Referensi klien JavaScript Login dengan Google:

Metode:

  • GoogleUser.getAuthResponse()

Update aplikasi web Anda dengan hasGrantedAllScopes() dan hasGrantedAnyScope() dengan mengikuti contoh izin terperinci ini.

Alur kode otorisasi

Perbarui atau Tambahkan endpoint kode otorisasi ke platform backend dengan mengikuti petunjuk dalam penanganan kode autentikasi.

Update platform Anda untuk mengikuti langkah-langkah yang dijelaskan dalam panduan Menggunakan Model Kode guna memvalidasi permintaan dan mendapatkan token akses dan token refresh.

Update platform Anda untuk mengaktifkan atau menonaktifkan fitur dan fungsi secara selektif berdasarkan cakupan individual yang telah disetujui pengguna dengan mengikuti petunjuk untuk otorisasi inkremental dan memeriksa cakupan akses yang diberikan oleh pengguna.

Contoh alur implisit

Cara lama

Library Klien GAPI

Contoh Library Klien Google API untuk JavaScript yang berjalan di browser menggunakan dialog pop-up untuk izin pengguna.

Modul gapi.auth2 otomatis dimuat dan digunakan oleh gapi.client.init(), sehingga akan disembunyikan.

<!DOCTYPE html>
  <html>
    <head>
      <script src="https://apis.google.com/js/api.js"></script>
      <script>
        function start() {
          gapi.client.init({
            'apiKey': 'YOUR_API_KEY',
            'clientId': 'YOUR_CLIENT_ID',
            'scope': 'https://www.googleapis.com/auth/cloud-translation',
            'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
          }).then(function() {
            // Execute an API request which is returned as a Promise.
            // The method name language.translations.list comes from the API discovery.
            return gapi.client.language.translations.list({
              q: 'hello world',
              source: 'en',
              target: 'de',
            });
          }).then(function(response) {
            console.log(response.result.data.translations[0].translatedText);
          }, function(reason) {
            console.log('Error: ' + reason.result.error.message);
          });
        };

        // Load the JavaScript client library and invoke start afterwards.
        gapi.load('client', start);
      </script>
    </head>
    <body>
      <div id="results"></div>
    </body>
  </html>

Library Klien JS

OAuth 2.0 untuk Aplikasi Web Sisi Klien yang berjalan di browser menggunakan dialog pop-up untuk izin pengguna.

Modul gapi.auth2 dimuat secara manual.

<!DOCTYPE html>
<html><head></head><body>
<script>
  var GoogleAuth;
  var SCOPE = 'https://www.googleapis.com/auth/drive.metadata.readonly';
  function handleClientLoad() {
    // Load the API's client and auth2 modules.
    // Call the initClient function after the modules load.
    gapi.load('client:auth2', initClient);
  }

  function initClient() {
    // In practice, your app can retrieve one or more discovery documents.
    var discoveryUrl = 'https://www.googleapis.com/discovery/v1/apis/drive/v3/rest';

    // Initialize the gapi.client object, which app uses to make API requests.
    // Get API key and client ID from API Console.
    // 'scope' field specifies space-delimited list of access scopes.
    gapi.client.init({
        'apiKey': 'YOUR_API_KEY',
        'clientId': 'YOUR_CLIENT_ID',
        'discoveryDocs': [discoveryUrl],
        'scope': SCOPE
    }).then(function () {
      GoogleAuth = gapi.auth2.getAuthInstance();

      // Listen for sign-in state changes.
      GoogleAuth.isSignedIn.listen(updateSigninStatus);

      // Handle initial sign-in state. (Determine if user is already signed in.)
      var user = GoogleAuth.currentUser.get();
      setSigninStatus();

      // Call handleAuthClick function when user clicks on
      //      "Sign In/Authorize" button.
      $('#sign-in-or-out-button').click(function() {
        handleAuthClick();
      });
      $('#revoke-access-button').click(function() {
        revokeAccess();
      });
    });
  }

  function handleAuthClick() {
    if (GoogleAuth.isSignedIn.get()) {
      // User is authorized and has clicked "Sign out" button.
      GoogleAuth.signOut();
    } else {
      // User is not signed in. Start Google auth flow.
      GoogleAuth.signIn();
    }
  }

  function revokeAccess() {
    GoogleAuth.disconnect();
  }

  function setSigninStatus() {
    var user = GoogleAuth.currentUser.get();
    var isAuthorized = user.hasGrantedScopes(SCOPE);
    if (isAuthorized) {
      $('#sign-in-or-out-button').html('Sign out');
      $('#revoke-access-button').css('display', 'inline-block');
      $('#auth-status').html('You are currently signed in and have granted ' +
          'access to this app.');
    } else {
      $('#sign-in-or-out-button').html('Sign In/Authorize');
      $('#revoke-access-button').css('display', 'none');
      $('#auth-status').html('You have not authorized this app or you are ' +
          'signed out.');
    }
  }

  function updateSigninStatus() {
    setSigninStatus();
  }
</script>

<button id="sign-in-or-out-button"
        style="margin-left: 25px">Sign In/Authorize</button>
<button id="revoke-access-button"
        style="display: none; margin-left: 25px">Revoke access</button>

<div id="auth-status" style="display: inline; padding-left: 25px"></div><hr>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script async defer src="https://apis.google.com/js/api.js"
        onload="this.onload=function(){};handleClientLoad()"
        onreadystatechange="if (this.readyState === 'complete') this.onload()">
</script>
</body></html>

Endpoint OAuth 2.0

OAuth 2.0 untuk Aplikasi Web Sisi Klien yang berjalan di browser menggunakan pengalihan ke Google untuk izin pengguna.

Contoh ini menunjukkan panggilan langsung ke endpoint OAuth 2.0 Google dari browser pengguna dan tidak menggunakan modul gapi.auth2 atau library JavaScript.

<!DOCTYPE html>
<html><head></head><body>
<script>
  var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE';
  var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE';
  var fragmentString = location.hash.substring(1);

  // Parse query string to see if page request is coming from OAuth 2.0 server.
  var params = {};
  var regex = /([^&=]+)=([^&]*)/g, m;
  while (m = regex.exec(fragmentString)) {
    params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
  }
  if (Object.keys(params).length > 0) {
    localStorage.setItem('oauth2-test-params', JSON.stringify(params) );
    if (params['state'] && params['state'] == 'try_sample_request') {
      trySampleRequest();
    }
  }

  // If there's an access token, try an API request.
  // Otherwise, start OAuth 2.0 flow.
  function trySampleRequest() {
    var params = JSON.parse(localStorage.getItem('oauth2-test-params'));
    if (params && params['access_token']) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET',
          'https://www.googleapis.com/drive/v3/about?fields=user&' +
          'access_token=' + params['access_token']);
      xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.response);
        } else if (xhr.readyState === 4 && xhr.status === 401) {
          // Token invalid, so prompt for user permission.
          oauth2SignIn();
        }
      };
      xhr.send(null);
    } else {
      oauth2SignIn();
    }
  }

  /*
   * Create form to request access token from Google's OAuth 2.0 server.
   */
  function oauth2SignIn() {
    // Google's OAuth 2.0 endpoint for requesting an access token
    var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';

    // Create element to open OAuth 2.0 endpoint in new window.
    var form = document.createElement('form');
    form.setAttribute('method', 'GET'); // Send as a GET request.
    form.setAttribute('action', oauth2Endpoint);

    // Parameters to pass to OAuth 2.0 endpoint.
    var params = {'client_id': YOUR_CLIENT_ID,
                  'redirect_uri': YOUR_REDIRECT_URI,
                  'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                  'state': 'try_sample_request',
                  'include_granted_scopes': 'true',
                  'response_type': 'token'};

    // Add form parameters as hidden input values.
    for (var p in params) {
      var input = document.createElement('input');
      input.setAttribute('type', 'hidden');
      input.setAttribute('name', p);
      input.setAttribute('value', params[p]);
      form.appendChild(input);
    }

    // Add form to page and submit it to open the OAuth 2.0 endpoint.
    document.body.appendChild(form);
    form.submit();
  }
</script>

<button onclick="trySampleRequest();">Try sample request</button>
</body></html>

Cara baru

Hanya SIG

Contoh ini hanya menampilkan library JavaScript Layanan Identitas Google menggunakan model token dan dialog pop-up untuk izin pengguna. Hal ini diperlukan untuk menggambarkan jumlah langkah minimal yang diperlukan untuk mengonfigurasi klien, meminta dan mendapatkan token akses, serta untuk memanggil Google API.

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      var access_token;

      function initClient() {
        client = google.accounts.oauth2.initTokenClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly \
                  https://www.googleapis.com/auth/contacts.readonly',
          callback: (tokenResponse) => {
            access_token = tokenResponse.access_token;
          },
        });
      }
      function getToken() {
        client.requestAccessToken();
      }
      function revokeToken() {
        google.accounts.oauth2.revoke(access_token, () => {console.log('access token revoked')});
      }
      function loadCalendar() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'https://www.googleapis.com/calendar/v3/calendars/primary/events');
        xhr.setRequestHeader('Authorization', 'Bearer ' + access_token);
        xhr.send();
      }
    </script>
    <h1>Google Identity Services Authorization Token model</h1>
    <button onclick="getToken();">Get access token</button><br><br>
    <button onclick="loadCalendar();">Load Calendar</button><br><br>
    <button onclick="revokeToken();">Revoke token</button>
  </body>
</html>

Aasync/await GAPI

Contoh ini menunjukkan cara menambahkan library Layanan Identitas Google menggunakan model token, menghapus modul gapi.auth2, dan memanggil API menggunakan Library Klien Google API untuk JavaScript.

Promise, asinkron, dan await digunakan untuk menerapkan urutan pemuatan library serta untuk menangkap dan mencoba ulang error otorisasi. Panggilan API hanya dilakukan setelah token akses yang valid tersedia.

Pengguna diharapkan menekan tombol 'Tampilkan Kalender' saat token akses tidak ada saat halaman pertama kali dimuat, atau setelah token akses tidak berlaku.

<!DOCTYPE html>
<html>
<head></head>
<body>
  <h1>GAPI with GIS async/await</h1>
  <button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
  <button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>

  <script>

    const gapiLoadPromise = new Promise((resolve, reject) => {
      gapiLoadOkay = resolve;
      gapiLoadFail = reject;
    });
    const gisLoadPromise = new Promise((resolve, reject) => {
      gisLoadOkay = resolve;
      gisLoadFail = reject;
    });

    var tokenClient;

    (async () => {
      document.getElementById("showEventsBtn").style.visibility="hidden";
      document.getElementById("revokeBtn").style.visibility="hidden";

      // First, load and initialize the gapi.client
      await gapiLoadPromise;
      await new Promise((resolve, reject) => {
        // NOTE: the 'auth2' module is no longer loaded.
        gapi.load('client', {callback: resolve, onerror: reject});
      });
      await gapi.client.init({
        // NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
      })
      .then(function() {  // Load the Calendar API discovery document.
        gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
      });

      // Now load the GIS client
      await gisLoadPromise;
      await new Promise((resolve, reject) => {
        try {
          tokenClient = google.accounts.oauth2.initTokenClient({
              client_id: 'YOUR_CLIENT_ID',
              scope: 'https://www.googleapis.com/auth/calendar.readonly',
              prompt: 'consent',
              callback: '',  // defined at request time in await/promise scope.
          });
          resolve();
        } catch (err) {
          reject(err);
        }
      });

      document.getElementById("showEventsBtn").style.visibility="visible";
      document.getElementById("revokeBtn").style.visibility="visible";
    })();

    async function getToken(err) {

      if (err.result.error.code == 401 || (err.result.error.code == 403) &&
          (err.result.error.status == "PERMISSION_DENIED")) {

        // The access token is missing, invalid, or expired, prompt for user consent to obtain one.
        await new Promise((resolve, reject) => {
          try {
            // Settle this promise in the response callback for requestAccessToken()
            tokenClient.callback = (resp) => {
              if (resp.error !== undefined) {
                reject(resp);
              }
              // GIS has automatically updated gapi.client with the newly issued access token.
              console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));
              resolve(resp);
            };
            tokenClient.requestAccessToken();
          } catch (err) {
            console.log(err)
          }
        });
      } else {
        // Errors unrelated to authorization: server errors, exceeding quota, bad requests, and so on.
        throw new Error(err);
      }
    }

    function showEvents() {

      // Try to fetch a list of Calendar events. If a valid access token is needed,
      // prompt to obtain one and then retry the original request.
      gapi.client.calendar.events.list({ 'calendarId': 'primary' })
      .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
      .catch(err  => getToken(err))  // for authorization errors obtain an access token
      .then(retry => gapi.client.calendar.events.list({ 'calendarId': 'primary' }))
      .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
      .catch(err  => console.log(err));   // cancelled by user, timeout, etc.
    }

    function revokeToken() {
      let cred = gapi.client.getToken();
      if (cred !== null) {
        google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
        gapi.client.setToken('');
      }
    }

  </script>

  <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoadOkay()" onerror="gapiLoadFail(event)"></script>
  <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoadOkay()" onerror="gisLoadFail(event)"></script>

</body>
</html>

Callback GAPI

Contoh ini menunjukkan cara menambahkan library Layanan Identitas Google menggunakan model token, menghapus modul gapi.auth2, dan memanggil API menggunakan Library Klien Google API untuk JavaScript.

Variabel digunakan untuk menerapkan urutan pemuatan library. Panggilan GAPI dibuat dari dalam callback setelah token akses yang valid ditampilkan.

Pengguna diharapkan menekan tombol Tampilkan Kalender saat halaman pertama kali dimuat dan saat mereka ingin memuat ulang info Kalender mereka.

<!DOCTYPE html>
<html>
<head>
  <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoad()"></script>
  <script async defer src="https://accounts.google.com/gsi/client" onload="gisInit()"></script>
</head>
<body>
  <h1>GAPI with GIS callbacks</h1>
  <button id="showEventsBtn" onclick="showEvents();">Show Calendar</button><br><br>
  <button id="revokeBtn" onclick="revokeToken();">Revoke access token</button>
  <script>
    let tokenClient;
    let gapiInited;
    let gisInited;

    document.getElementById("showEventsBtn").style.visibility="hidden";
    document.getElementById("revokeBtn").style.visibility="hidden";

    function checkBeforeStart() {
       if (gapiInited && gisInited){
          // Start only when both gapi and gis are initialized.
          document.getElementById("showEventsBtn").style.visibility="visible";
          document.getElementById("revokeBtn").style.visibility="visible";
       }
    }

    function gapiInit() {
      gapi.client.init({
        // NOTE: OAuth2 'scope' and 'client_id' parameters have moved to initTokenClient().
      })
      .then(function() {  // Load the Calendar API discovery document.
        gapi.client.load('https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest');
        gapiInited = true;
        checkBeforeStart();
      });
    }

    function gapiLoad() {
        gapi.load('client', gapiInit)
    }

    function gisInit() {
     tokenClient = google.accounts.oauth2.initTokenClient({
                client_id: 'YOUR_CLIENT_ID',
                scope: 'https://www.googleapis.com/auth/calendar.readonly',
                callback: '',  // defined at request time
            });
      gisInited = true;
      checkBeforeStart();
    }

    function showEvents() {

      tokenClient.callback = (resp) => {
        if (resp.error !== undefined) {
          throw(resp);
        }
        // GIS has automatically updated gapi.client with the newly issued access token.
        console.log('gapi.client access token: ' + JSON.stringify(gapi.client.getToken()));

        gapi.client.calendar.events.list({ 'calendarId': 'primary' })
        .then(calendarAPIResponse => console.log(JSON.stringify(calendarAPIResponse)))
        .catch(err => console.log(err));

        document.getElementById("showEventsBtn").innerText = "Refresh Calendar";
      }

      // Conditionally ask users to select the Google Account they'd like to use,
      // and explicitly obtain their consent to fetch their Calendar.
      // NOTE: To request an access token a user gesture is necessary.
      if (gapi.client.getToken() === null) {
        // Prompt the user to select an Google Account and asked for consent to share their data
        // when establishing a new session.
        tokenClient.requestAccessToken({prompt: 'consent'});
      } else {
        // Skip display of account chooser and consent dialog for an existing session.
        tokenClient.requestAccessToken({prompt: ''});
      }
    }

    function revokeToken() {
      let cred = gapi.client.getToken();
      if (cred !== null) {
        google.accounts.oauth2.revoke(cred.access_token, () => {console.log('Revoked: ' + cred.access_token)});
        gapi.client.setToken('');
        document.getElementById("showEventsBtn").innerText = "Show Calendar";
      }
    }
  </script>
</body>
</html>

Contoh alur kode otorisasi

UX pop-up library Layanan Identitas Google dapat menggunakan pengalihan URL untuk menampilkan kode otorisasi langsung ke endpoint token backend, atau pengendali callback JavaScript yang berjalan di browser pengguna yang mengirimkan respons ke platform Anda. Apa pun kasusnya, platform backend Anda akan menyelesaikan alur OAuth 2.0 untuk mendapatkan token akses dan refresh yang valid.

Cara lama

Aplikasi Web Sisi Server

Login dengan Google untuk aplikasi sisi server yang berjalan di platform backend menggunakan pengalihan ke Google untuk izin pengguna.

<!DOCTYPE html>
<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
    <script src="https://apis.google.com/js/client:platform.js?onload=start" async defer></script>
    <script>
      function start() {
        gapi.load('auth2', function() {
          auth2 = gapi.auth2.init({
            client_id: 'YOUR_CLIENT_ID',
            api_key: 'YOUR_API_KEY',
            discovery_docs: ['https://www.googleapis.com/discovery/v1/apis/translate/v2/rest'],
            // Scopes to request in addition to 'profile' and 'email'
            scope: 'https://www.googleapis.com/auth/cloud-translation',
          });
        });
      }
      function signInCallback(authResult) {
        if (authResult['code']) {
          console.log("sending AJAX request");
          // Send authorization code obtained from Google to backend platform
          $.ajax({
            type: 'POST',
            url: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
            // Always include an X-Requested-With header to protect against CSRF attacks.
            headers: {
              'X-Requested-With': 'XMLHttpRequest'
            },
            contentType: 'application/octet-stream; charset=utf-8',
            success: function(result) {
              console.log(result);
            },
            processData: false,
            data: authResult['code']
          });
        } else {
          console.log('error: failed to obtain authorization code')
        }
      }
    </script>
  </head>
  <body>
    <button id="signinButton">Sign In With Google</button>
    <script>
      $('#signinButton').click(function() {
        // Obtain an authorization code from Google
        auth2.grantOfflineAccess().then(signInCallback);
      });
    </script>
  </body>
</html>

HTTP/REST menggunakan pengalihan

Menggunakan OAuth 2.0 untuk Aplikasi Server Web untuk mengirim kode otorisasi dari browser pengguna ke platform backend Anda. Izin pengguna ditangani dengan mengalihkan browser pengguna ke Google.

/\*
 \* Create form to request access token from Google's OAuth 2.0 server.
 \*/
function oauthSignIn() {
  // Google's OAuth 2.0 endpoint for requesting an access token
  var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth';
  // Create &lt;form> element to submit parameters to OAuth 2.0 endpoint.
  var form = document.createElement('form');
  form.setAttribute('method', 'GET'); // Send as a GET request.
  form.setAttribute('action', oauth2Endpoint);
  // Parameters to pass to OAuth 2.0 endpoint.
  var params = {'client\_id': 'YOUR_CLIENT_ID',
                'redirect\_uri': 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URL',
                'response\_type': 'token',
                'scope': 'https://www.googleapis.com/auth/drive.metadata.readonly',
                'include\_granted\_scopes': 'true',
                'state': 'pass-through value'};
  // Add form parameters as hidden input values.
  for (var p in params) {
    var input = document.createElement('input');
    input.setAttribute('type', 'hidden');
    input.setAttribute('name', p);
    input.setAttribute('value', params[p]);
    form.appendChild(input);
  }

  // Add form to page and submit it to open the OAuth 2.0 endpoint.
  document.body.appendChild(form);
  form.submit();
}

Cara baru

UX Pop-up GIS

Contoh ini hanya menampilkan library JavaScript Layanan Identitas Google menggunakan model kode otorisasi dialog pop-up untuk izin pengguna dan pengendali callback untuk menerima kode otorisasi dari Google. Fungsi ini disediakan untuk menjelaskan jumlah langkah minimal yang diperlukan untuk mengonfigurasi klien, mendapatkan izin, dan mengirimkan kode otorisasi ke platform backend Anda.

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      function initClient() {
        client = google.accounts.oauth2.initCodeClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly',
          ux_mode: 'popup',
          callback: (response) => {
            var code_receiver_uri = 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI',
            // Send auth code to your backend platform
            const xhr = new XMLHttpRequest();
            xhr.open('POST', code_receiver_uri, true);
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            xhr.onload = function() {
              console.log('Signed in as: ' + xhr.responseText);
            };
            xhr.send('code=' + code);
            // After receipt, the code is exchanged for an access token and
            // refresh token, and the platform then updates this web app
            // running in user's browser with the requested calendar info.
          },
        });
      }
      function getAuthCode() {
        // Request authorization code and obtain user consent
          client.requestCode();
      }
    </script>
    <button onclick="getAuthCode();">Load Your Calendar</button>
  </body>
</html>

UX Pengalihan GIS

Model kode otorisasi mendukung pop-up dan mengalihkan mode UX untuk mengirim kode otorisasi per pengguna ke endpoint yang dihosting oleh platform Anda. Mode UX pengalihan ditampilkan di sini:

<!DOCTYPE html>
<html>
  <head>
    <script src="https://accounts.google.com/gsi/client" onload="initClient()" async defer></script>
  </head>
  <body>
    <script>
      var client;
      function initClient() {
        client = google.accounts.oauth2.initCodeClient({
          client_id: 'YOUR_CLIENT_ID',
          scope: 'https://www.googleapis.com/auth/calendar.readonly \
                  https://www.googleapis.com/auth/photoslibrary.readonly',
          ux_mode: 'redirect',
          redirect_uri: 'YOUR_AUTHORIZATION_CODE_ENDPOINT_URI'
        });
      }
      // Request an access token
      function getAuthCode() {
        // Request authorization code and obtain user consent
          client.requestCode();
      }
    </script>
    <button onclick="getAuthCode();">Load Your Calendar</button>
  </body>
</html>

Library JavaScript

Layanan Identitas Google adalah satu library JavaScript yang digunakan untuk autentikasi dan otorisasi pengguna yang menggabungkan serta mengganti fitur dan fungsi yang ditemukan dalam beberapa library dan modul yang berbeda:

Tindakan yang harus dilakukan saat bermigrasi ke Layanan Identitas:

Library JS yang ada Library JS baru Catatan
apis.google.com/js/api.js accounts.google.com/gsi/client Tambahkan library baru dan ikuti alur implisit.
apis.google.com/js/client.js accounts.google.com/gsi/client Tambahkan library baru dan alur kode otorisasi.

Referensi singkat koleksi

Perbandingan objek dan metode antara library klien JavaScript Login dengan Google Lama dan library Layanan Google Identity Baru serta Catatan dengan informasi dan tindakan tambahan untuk diambil selama migrasi.

Lama Baru Catatan
Objek GoogleAuth dan metode terkait:
GoogleAuth.AttachClickHandler() Hapus
GoogleAuth.currentUser.get() Hapus
GoogleAuth.currentUser.listen() Hapus
GoogleAuth.disconnect() google.accounts.oauth2.revoke Ganti yang lama dengan yang baru. Pencabutan juga dapat dilakukan dari https://myaccount.google.com/permissions
GoogleAuth.grantOfflineAccess() Hapus, ikuti alur kode otorisasi.
GoogleAuth.isSignedIn.get() Hapus
GoogleAuth.isSignedIn.listen() Hapus
GoogleAuth.signIn() Hapus
GoogleAuth.signOut() Hapus
GoogleAuth.then() Hapus
GoogleUser dan metode terkait:
GoogleUser.disconnect() google.accounts.id.revoke Ganti yang lama dengan yang baru. Pencabutan juga dapat dilakukan dari https://myaccount.google.com/permissions
GoogleUser.getAuthResponse() requestCode() atau requestAccessToken() Ganti yang lama dengan yang baru
GoogleUser.getBasicProfile() Hapus. Sebagai gantinya, gunakan Token ID, lihat Bermigrasi dari Login dengan Google.
GoogleUser.getGrantedScopes() hasGrantedAnyScope() Ganti yang lama dengan yang baru
GoogleUser.getHostedDomain() Hapus
GoogleUser.getId() Hapus
GoogleUser.grantOfflineAccess() Hapus, ikuti alur kode otorisasi.
GoogleUser.grant() Hapus
GoogleUser.hasGrantedScopes() hasGrantedAnyScope() Ganti yang lama dengan yang baru
GoogleUser.isSignedIn() Hapus
GoogleUser.reloadAuthResponse() requestAccessToken() Hapus yang lama, panggil yang baru untuk mengganti token akses yang masa berlakunya sudah berakhir atau dicabut.
Objek gapi.auth2 dan metode terkait:
Objek gapi.auth2.AuthorizeConfig TokenClientConfig atau CodeClientConfig Ganti yang lama dengan yang baru
Objek gapi.auth2.AuthorizeResponse Hapus
Objek gapi.auth2.AuthResponse Hapus
gapi.auth2.authorize() requestCode() atau requestAccessToken() Ganti yang lama dengan yang baru
gapi.auth2.ClientConfig() TokenClientConfig atau CodeClientConfig Ganti yang lama dengan yang baru
gapi.auth2.getAuthInstance() Hapus
gapi.auth2.init() initTokenClient() atau initCodeClient() Ganti yang lama dengan yang baru
Objek gapi.auth2.OfflineAccessOptions Hapus
Objek gapi.auth2.SignInOptions Hapus
Objek gapi.signin2 dan metode terkait:
gapi.signin2.render() Hapus. Pemuatan DOM HTML elemen g_id_signin atau panggilan JS ke google.accounts.id.renderButton memicu login pengguna ke Akun Google.

Contoh kredensial

Kredensial yang ada

Library platform Login dengan Google, Library Klien Google API untuk JavaScript, atau panggilan langsung ke endpoint Google Auth 2.0 menampilkan token akses OAuth 2.0 dan Token ID OpenID Connect dalam satu respons.

Contoh respons yang berisi access_token dan id_token:

  {
    "token_type": "Bearer",
    "access_token": "ya29.A0ARrdaM-SmArZaCIh68qXsZSzyeU-8mxhQERHrP2EXtxpUuZ-3oW8IW7a6D2J6lRnZrRj8S6-ZcIl5XVEqnqxq5fuMeDDH_6MZgQ5dgP7moY-yTiKR5kdPm-LkuPM-mOtUsylWPd1wpRmvw_AGOZ1UUCa6UD5Hg",
    "scope": "https://www.googleapis.com/auth/calendar.readonly",
    "login_hint": "AJDLj6I2d1RH77cgpe__DdEree1zxHjZJr4Q7yOisoumTZUmo5W2ZmVFHyAomUYzLkrluG-hqt4RnNxrPhArd5y6p8kzO0t8xIfMAe6yhztt6v2E-_Bb4Ec3GLFKikHSXNh5bI-gPrsI",
    "expires_in": 3599,
    "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjkzNDFhYmM0MDkyYjZmYzAzOGU0MDNjOTEwMjJkZDNlNDQ1MzliNTYiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwiYXVkIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTE3NzI2NDMxNjUxOTQzNjk4NjAwIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXRfaGFzaCI6IkJBSW55TjN2MS1ZejNLQnJUMVo0ckEiLCJuYW1lIjoiQnJpYW4gRGF1Z2hlcnR5IiwicGljdHVyZSI6Imh0dHBzOi8vbGgzLmdvb2dsZXVzZXJjb250ZW50LmNvbS9hLS9BT2gxNEdnenAyTXNGRGZvbVdMX3VDemRYUWNzeVM3ZGtxTE5ybk90S0QzVXNRPXM5Ni1jIiwiZ2l2ZW5fbmFtZSI6IkJyaWFuIiwiZmFtaWx5X25hbWUiOiJEYXVnaGVydHkiLCJsb2NhbGUiOiJlbiIsImlhdCI6MTYzODk5MTYzOCwiZXhwIjoxNjM4OTk1MjM4LCJqdGkiOiI5YmRkZjE1YWFiNzE2ZDhjYmJmNDYwMmM1YWM3YzViN2VhMDQ5OTA5In0.K3EA-3Adw5HA7O8nJVCsX1HmGWxWzYk3P7ViVBb4H4BoT2-HIgxKlx1mi6jSxIUJGEekjw9MC-nL1B9Asgv1vXTMgoGaNna0UoEHYitySI23E5jaMkExkTSLtxI-ih2tJrA2ggfA9Ekj-JFiMc6MuJnwcfBTlsYWRcZOYVw3QpdTZ_VYfhUu-yERAElZCjaAyEXLtVQegRe-ymScra3r9S92TA33ylMb3WDTlfmDpWL0CDdDzby2asXYpl6GQ7SdSj64s49Yw6mdGELZn5WoJqG7Zr2KwIGXJuSxEo-wGbzxNK-mKAiABcFpYP4KHPEUgYyz3n9Vqn2Tfrgp-g65BQ",
    "session_state": {
      "extraQueryParams": {
        "authuser": "0"
      }
    },
    "first_issued_at": 1638991637982,
    "expires_at": 1638995236982,
    "idpId": "google"
  }

Kredensial Layanan Identitas Google

Library Layanan Identitas Google menampilkan:

  • token akses saat digunakan untuk otorisasi:
  {
    "access_token": "ya29.A0ARrdaM_LWSO-uckLj7IJVNSfnUityT0Xj-UCCrGxFQdxmLiWuAosnAKMVQ2Z0LLqeZdeJii3TgULp6hR_PJxnInBOl8UoUwWoqsrGQ7-swxgy97E8_hnzfhrOWyQBmH6zs0_sUCzwzhEr_FAVqf92sZZHphr0g",
    "token_type": "Bearer",
    "expires_in": 3599,
    "scope": "https://www.googleapis.com/auth/calendar.readonly"
  }
  • atau, token ID saat digunakan untuk autentikasi:
  {
  "clientId": "538344653255-758c5h5isc45vgk27d8h8deabovpg6to.apps.googleusercontent.com",
  "credential": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImMxODkyZWI0OWQ3ZWY5YWRmOGIyZTE0YzA1Y2EwZDAzMjcxNGEyMzciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJuYmYiOjE2MzkxNTcyNjQsImF1ZCI6IjUzODM0NDY1MzI1NS03NThjNWg1aXNjNDV2Z2syN2Q4aDhkZWFib3ZwZzZ0by5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsInN1YiI6IjExNzcyNjQzMTY1MTk0MzY5ODYwMCIsIm5vbmNlIjoiZm9vYmFyIiwiaGQiOiJnb29nbGUuY29tIiwiZW1haWwiOiJkYWJyaWFuQGdvb2dsZS5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiYXpwIjoiNTM4MzQ0NjUzMjU1LTc1OGM1aDVpc2M0NXZnazI3ZDhoOGRlYWJvdnBnNnRvLmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwibmFtZSI6IkJyaWFuIERhdWdoZXJ0eSIsInBpY3R1cmUiOiJodHRwczovL2xoMy5nb29nbGV1c2VyY29udGVudC5jb20vYS0vQU9oMTRHZ3pwMk1zRkRmb21XTF91Q3pkWFFjc3lTN2RrcUxOcm5PdEtEM1VzUT1zOTYtYyIsImdpdmVuX25hbWUiOiJCcmlhbiIsImZhbWlseV9uYW1lIjoiRGF1Z2hlcnR5IiwiaWF0IjoxNjM5MTU3NTY0LCJleHAiOjE2MzkxNjExNjQsImp0aSI6IjRiOTVkYjAyZjU4NDczMmUxZGJkOTY2NWJiMWYzY2VhYzgyMmI0NjUifQ.Cr-AgMsLFeLurnqyGpw0hSomjOCU4S3cU669Hyi4VsbqnAV11zc_z73o6ahe9Nqc26kPVCNRGSqYrDZPfRyTnV6g1PIgc4Zvl-JBuy6O9HhClAK1HhMwh1FpgeYwXqrng1tifmuotuLQnZAiQJM73Gl-J_6s86Buo_1AIx5YAKCucYDUYYdXBIHLxrbALsA5W6pZCqqkMbqpTWteix-G5Q5T8LNsfqIu_uMBUGceqZWFJALhS9ieaDqoxhIqpx_89QAr1YlGu_UO6R6FYl0wDT-nzjyeF5tonSs3FHN0iNIiR3AMOHZu7KUwZaUdHg4eYkU-sQ01QNY_11keHROCRQ",
  "select_by": "user"
  }

Respons token tidak valid

Contoh respons dari Google saat mencoba membuat permintaan API menggunakan token akses yang habis masa berlakunya, dicabut, atau tidak valid:

Header Respons HTTP

  www-authenticate: Bearer realm="https://accounts.google.com/", error="invalid_token"

Isi respons

  {
    "error": {
      "code": 401,
      "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
      "errors": [
        {
          "message": "Invalid Credentials",
          "domain": "global",
          "reason": "authError",
          "location": "Authorization",
          "locationType": "header"
        }
      ],
      "status": "UNAUTHENTICATED"
    }
  }