Penautan Akun Google dengan OAuth (Alur Implisit - Diarsipkan)

Untuk mendukung alur implisit OAuth 2.0, layanan Anda menyediakan endpoint otorisasi melalui HTTPS. Endpoint ini bertanggung jawab untuk autentikasi dan mendapatkan izin dari pengguna untuk akses data. Endpoint otorisasi menampilkan UI login kepada pengguna yang belum login dan mencatat izin untuk akses yang diminta.

Saat aplikasi Google perlu memanggil salah satu API resmi layanan Anda, Google menggunakan endpoint ini untuk mendapatkan izin dari pengguna Anda agar dapat memanggil API ini atas nama mereka.

Penautan Akun Google: Alur Implisit OAuth

Diagram urutan berikut menjelaskan interaksi antara Pengguna, Google, dan endpoint layanan Anda.

Pengguna Aplikasi Google / Browser Endpoint Auth Anda 1. Pengguna memulai penautan 2. Pengalihan ke Endpoint Auth (GET) client_id, redirect_uri, state, scope 3. Menampilkan Layar Izin & Layar Login 4. Pengguna Mengautentikasi & Memberikan Izin 5. Pengalihan kembali ke Google dengan Token (GET) access_token, state 6. Menyimpan token pengguna 7. Mengakses resource pengguna
Gambar 1. Urutan peristiwa dalam alur Implisit OAuth 2.0 untuk Penautan Akun Google.

Peran dan tanggung jawab

Tabel berikut menentukan peran dan tanggung jawab aktor dalam alur OAuth Implisit Penautan Akun Google (GAL). Perhatikan bahwa di GAL, Google bertindak sebagai Klien OAuth, sedangkan layanan Anda bertindak sebagai Penyedia Layanan/Identitas.

Aktor / Komponen Peran GAL Tanggung Jawab
Aplikasi / Server Google Klien OAuth Memulai alur, menerima token akses menggunakan pengalihan browser, dan menyimpannya dengan aman untuk mengakses API layanan Anda.
Endpoint Otorisasi Anda Server Otorisasi Mengautentikasi pengguna Anda, mendapatkan izin mereka, dan menerbitkan token akses yang berlaku lama langsung ke Google.
URI Pengalihan Google Endpoint Callback Menerima pengalihan pengguna dari layanan otorisasi Anda dengan nilai access_token dan state dalam fragmen URL.

Sesi alur implisit OAuth 2.0 umum yang dimulai oleh Google memiliki alur berikut:

  1. Google membuka endpoint otorisasi Anda di browser pengguna. Pengguna login, jika belum login, dan memberikan izin kepada Google untuk mengakses datanya dengan API Anda, jika mereka belum memberikan izin.
  2. Layanan Anda membuat token akses dan menampilkannya ke Google. Untuk melakukannya, alihkan browser pengguna kembali ke Google dengan token akses yang dilampirkan pada permintaan.
  3. Google memanggil API layanan Anda dan melampirkan token akses dengan setiap permintaan. Layanan Anda memverifikasi bahwa token akses memberikan otorisasi Google untuk mengakses API, lalu menyelesaikan panggilan API.

Resep Penerapan

Ikuti langkah-langkah berikut untuk menerapkan alur Implicit.

Langkah 1: Menangani permintaan otorisasi

Saat memulai penautan akun, Google akan mengalihkan pengguna ke endpoint otorisasi Anda. Untuk mengetahui detail kontrak protokol dan persyaratan parameter, lihat Authorization Endpoint.

Untuk menangani permintaan, lakukan tindakan berikut:

  1. Validasi permintaan:

    • Konfirmasi bahwa client_id cocok dengan Client ID yang ditetapkan ke Google.
    • Pastikan redirect_uri cocok dengan URL pengalihan Google yang diharapkan: none https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
    • Pastikan response_type adalah token.
  2. Mengautentikasi pengguna:

    • Periksa apakah pengguna login ke layanan Anda.
    • Jika pengguna tidak login, minta mereka untuk menyelesaikan alur login atau pendaftaran Anda.
  3. Buat token akses:

    • Buat token akses unik yang tidak dapat ditebak dan terkait dengan pengguna dan klien.
  4. Mengarahkan kembali ke Google:

    • Alihkan browser ke URL yang diberikan di redirect_uri.
    • Tambahkan parameter berikut dalam fragmen URL (hash):
      • access_token: Token akses yang Anda buat.
      • token_type: Harus bearer.
      • state: Nilai status yang tidak diubah yang diterima dari Google.
Menangani permintaan info pengguna

Endpoint userinfo adalah resource yang dilindungi OAuth 2.0 yang menampilkan klaim tentang pengguna yang ditautkan. Menerapkan dan menghosting endpoint userinfo bersifat opsional, kecuali untuk kasus penggunaan berikut:

Setelah token akses berhasil diambil dari endpoint token Anda, Google akan mengirimkan permintaan ke endpoint userinfo Anda untuk mengambil informasi profil dasar tentang pengguna yang ditautkan.

header permintaan endpoint userinfo
Authorization header Token akses jenis Bearer.

Misalnya, jika endpoint userinfo Anda tersedia di https://myservice.example.com/userinfo, permintaan mungkin akan terlihat seperti berikut:

GET /userinfo HTTP/1.1
Host: myservice.example.com
Authorization: Bearer ACCESS_TOKEN

Agar endpoint userinfo Anda dapat menangani permintaan, lakukan langkah-langkah berikut:

  1. Ekstrak token akses dari header Otorisasi dan tampilkan informasi untuk pengguna yang terkait dengan token akses.
  2. Jika token akses tidak valid, tampilkan error HTTP 401 Tidak Sah dengan menggunakan Header Respons WWW-Authenticate. Berikut adalah contoh respons error userinfo:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    Jika pesan error 401 Tidak Sah, atau respons error lainnya yang tidak berhasil ditampilkan selama proses penautan, error tersebut tidak akan dapat dipulihkan, token yang diambil akan dihapus dan pengguna harus memulai proses penautan lagi.
  3. Jika token akses valid, tampilkan dan respons HTTP 200 dengan objek JSON berikut dalam isi HTTPS respons:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    Jika endpoint userinfo Anda menampilkan respons sukses HTTP 200, token dan klaim yang diambil akan didaftarkan terhadap Akun Google pengguna.

    respons endpoint userinfo
    sub ID unik yang mengidentifikasi pengguna di sistem Anda.
    email Alamat email pengguna.
    given_name Opsional: Nama depan pengguna.
    family_name Opsional: Nama belakang pengguna.
    name Opsional: Nama lengkap pengguna.
    picture Opsional: Foto profil pengguna.