Penautan Akun Google dengan OAuth

Akun ditautkan menggunakan alur implisit dan kode otorisasi OAuth 2.0 standar industri. Layanan Anda harus mendukung endpoint otorisasi dan pertukaran token yang mematuhi OAuth 2.0.

隐式流程中,Google 会在用户的浏览器中打开您的授权端点。成功登录后,系统会将长期访问令牌返回到 Google。现在,从 Google 发送的每个请求中都包含此访问令牌。

授权代码流程中,您需要两个端点:

  • 授权端点 - 向尚未登录的用户显示登录界面。授权端点还会创建一个短期授权代码,用于记录用户针对所请求的访问权限的同意情况。

  • 令牌交换端点,负责两种交换类型:

    1. 将授权代码交换为长期刷新令牌和短期访问令牌。这种交换会在用户完成帐号关联流程时进行。
    2. 将长期有效的刷新令牌交换为短期访问令牌。当 Google 需要新的访问令牌时,由于此令牌已过期,因此出现这种交换。

选择 OAuth 2.0 流程

虽然隐式数据流的实现过程更简单,但 Google 建议隐式数据流签发的访问令牌永远不会过期。这是因为在令牌随隐式流程过期后,用户被迫再次关联自己的帐号。出于安全考虑,如果您需要令牌过期,我们强烈建议您改为使用授权代码流程。

设计准则

本部分将介绍针对 OAuth 关联流程托管的用户屏幕的设计要求和建议。在由 Google 的应用调用后,您的平台会向用户显示“登录 Google”页面和帐号关联屏幕。用户同意关联帐号后,会被重定向回 Google 的应用。

此图显示了用户将其 Google 帐号与身份验证系统关联的步骤。第一个屏幕截图显示了用户从您的平台发起的关联。第二张图片展示了用户登录 Google 的界面,第三张图片显示了用户同意将其 Google 帐号与应用关联的确认消息。最后的屏幕截图显示的是已成功在 Google 应用中关联的用户帐号。
图 1.帐号关联用户登录 Google 和同意屏幕。

要求

  1. 您必须告知用户该用户帐号将与 Google 关联,而不是与特定 Google 产品(例如 Google Home 或 Google 助理)关联。

建议

建议您执行以下操作:

  1. 显示 Google 的隐私权政策。在同意屏幕上添加指向 Google 隐私权政策的链接。

  2. 要共享的数据。使用简洁明了的语言向用户说明他们的 Google 需要哪些数据以及为何收集这些数据。

  3. 明确的号召性用语。在同意屏幕上提供明确的号召性用语,例如“同意并关联”。这是因为用户需要了解他们需要与 Google 共享哪些数据,才能关联帐号。

  4. 能够取消。如果用户不关联,则可以提供返回或取消的方式。

  5. 清除登录流程。确保用户有明确的登录 Google 帐号的方法,例如用户名和密码字段或使用 Google 帐号登录字段。

  6. 能够解除关联。为用户提供解除关联的机制,例如他们在平台上的帐号设置网址。或者,您也可以添加指向 Google 帐号的链接,以便用户可以管理关联的帐号。

  7. 能够更改用户帐号。推荐一种供用户切换帐号的方法。如果用户往往拥有多个帐号,这一点尤其有用。

    • 如果用户必须关闭同意屏幕才能切换帐号,请向 Google 发送一个可恢复错误,以便用户通过 OAuth 关联隐式流程登录所需帐号。
  8. 添加徽标。在同意屏幕上显示公司徽标。 根据样式指南放置徽标。如果您还希望显示 Google 的徽标,请参阅徽标和商标

Membuat project

Untuk membuat project agar dapat menggunakan penautan akun:

  1. Go to the Google API Console.
  2. Klik Buat proyek .
  3. Masukkan nama atau terima saran yang dihasilkan.
  4. Konfirmasikan atau edit bidang yang tersisa.
  5. Klik Buat .

Untuk melihat ID proyek Anda:

  1. Go to the Google API Console.
  2. Temukan proyek Anda di tabel di halaman arahan. ID proyek muncul di kolom ID .

Proses Penautan Akun Google mencakup layar izin yang memberi tahu pengguna bahwa aplikasi meminta akses ke data mereka, jenis data apa yang mereka minta, dan persyaratan yang berlaku. Anda perlu mengonfigurasi layar izin OAuth sebelum membuat client ID Google API.

  1. Buka halaman OAuth consent screen dari konsol API Google.
  2. Jika diminta, pilih project yang baru saja Anda buat.
  3. Di halaman "Layar izin OAuth", isi formulir dan klik tombol "Simpan".

    Nama aplikasi: Nama aplikasi yang meminta izin. Nama harus mencerminkan aplikasi Anda secara akurat dan konsisten dengan nama aplikasi yang dilihat pengguna di tempat lain. Nama aplikasi akan ditampilkan di layar izin Penautan Akun.

    Logo aplikasi: Gambar di layar izin yang akan membantu pengguna mengenali aplikasi Anda. Logo ditampilkan di layar izin Penautan akun dan di setelan akun

    Email dukungan: Agar pengguna dapat menghubungi Anda jika ada pertanyaan tentang izin mereka.

    Cakupan untuk Google API: Cakupan memungkinkan aplikasi Anda mengakses data pribadi Google pengguna. Untuk kasus penggunaan Penautan Akun Google, cakupan default (email, profil, openid) sudah cukup, Anda tidak perlu menambahkan cakupan sensitif apa pun. Secara umum, praktik terbaiknya adalah meminta cakupan secara bertahap pada saat akses diperlukan, bukan sejak awal. Pelajari lebih lanjut.

    Domain yang diotorisasi: Untuk melindungi Anda dan pengguna, Google hanya mengizinkan aplikasi yang melakukan autentikasi menggunakan OAuth untuk menggunakan Domain yang Diotorisasi. Link aplikasi Anda harus dihosting di Authorized Domains. Pelajari lebih lanjut.

    Link Halaman Beranda Aplikasi: Halaman beranda aplikasi Anda. Harus dihosting di Domain yang Diotorisasi.

    Link Kebijakan Privasi Aplikasi: Ditampilkan di layar izin Penautan Akun Google. Harus dihosting di Domain yang Diotorisasi.

    Link Persyaratan Layanan Aplikasi (Opsional): Harus dihosting di Domain yang Diotorisasi.

    Gambar 1. Layar Izin Penautan Akun Google untuk Aplikasi fiktif, Tuner

  4. Periksa "Status Verifikasi", jika permohonan Anda memerlukan verifikasi, klik tombol "Kirim Untuk Verifikasi" untuk mengirimkan permohonan verifikasi. Lihat Persyaratan verifikasi OAuth untuk mengetahui detailnya.

Mengimplementasikan server OAuth

Sebuah OAuth pelaksanaan 2.0 server dari aliran kode otorisasi terdiri dari dua endpoint, yang layanan Anda membuat tersedia dengan HTTPS. Titik akhir pertama adalah titik akhir otorisasi, yang bertanggung jawab untuk menemukan atau memperoleh persetujuan dari pengguna untuk akses data. Titik akhir otorisasi menyajikan UI masuk ke pengguna Anda yang belum masuk dan mencatat persetujuan untuk akses yang diminta. Titik akhir kedua adalah titik akhir pertukaran token, yang digunakan untuk mendapatkan string terenkripsi, yang disebut token, yang memberi wewenang kepada pengguna untuk mengakses layanan Anda.

Saat aplikasi Google perlu memanggil salah satu API layanan Anda, Google menggunakan titik akhir ini bersama-sama untuk mendapatkan izin dari pengguna Anda untuk memanggil API ini atas nama mereka.

Sesi alur kode otorisasi OAuth 2.0 yang dimulai oleh Google memiliki alur berikut:

  1. Google membuka titik akhir otorisasi Anda di browser pengguna. Jika alur dimulai pada perangkat khusus suara untuk Tindakan, Google mentransfer eksekusi ke telepon.
  2. Pengguna masuk, jika belum masuk, dan memberikan izin kepada Google untuk mengakses data mereka dengan API Anda, jika mereka belum memberikan izin.
  3. Layanan Anda menciptakan kode otorisasi dan kembali ke Google. Untuk melakukannya, arahkan kembali browser pengguna ke Google dengan kode otorisasi yang dilampirkan pada permintaan.
  4. Google mengirimkan kode otorisasi untuk endpoint pertukaran token Anda, yang memverifikasi keaslian kode dan mengembalikan sebuah token dan refresh token akses. Token akses adalah token berumur pendek yang diterima layanan Anda sebagai kredensial untuk mengakses API. Token penyegaran adalah token berumur panjang yang dapat disimpan dan digunakan oleh Google untuk memperoleh token akses baru saat token tersebut kedaluwarsa.
  5. Setelah pengguna menyelesaikan alur penautan akun, setiap permintaan berikutnya yang dikirim dari Google berisi token akses.

Menangani permintaan otorisasi

Saat Anda perlu melakukan penautan akun menggunakan alur kode otorisasi OAuth 2.0, Google mengirimkan pengguna ke titik akhir otorisasi Anda dengan permintaan yang menyertakan parameter berikut:

Parameter titik akhir otorisasi
client_id ID Klien yang Anda tetapkan ke Google.
redirect_uri URL tujuan Anda mengirim tanggapan atas permintaan ini.
state Nilai pembukuan yang diteruskan kembali ke Google tidak berubah di URI pengalihan.
scope Opsional: Sebuah set ruang-delimited string lingkup yang menentukan data Google meminta otorisasi untuk.
response_type Jenis nilai yang akan dikembalikan dalam respons. Untuk aliran kode 2.0 otorisasi OAuth, jenis respon selalu code .
user_locale Akun Google pengaturan bahasa di RFC5646 format yang, digunakan untuk melokalisasi konten Anda dalam bahasa pilihan pengguna.

Misalnya, jika endpoint otorisasi Anda tersedia di https://myservice.example.com/auth , permintaan akan terlihat seperti berikut ini:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code&user_locale=LOCALE

Agar titik akhir otorisasi Anda menangani permintaan masuk, lakukan langkah-langkah berikut:

  1. Verifikasi bahwa client_id sesuai dengan ID Klien Anda ditugaskan untuk Google, dan bahwa redirect_uri cocok URL redirect yang disediakan oleh Google untuk layanan Anda. Pemeriksaan ini penting untuk mencegah pemberian akses ke aplikasi klien yang tidak diinginkan atau salah dikonfigurasi. Jika Anda mendukung beberapa OAuth 2.0 arus, juga mengkonfirmasi bahwa response_type adalah code .
  2. Periksa apakah pengguna masuk ke layanan Anda. Jika pengguna tidak masuk, selesaikan alur masuk atau pendaftaran layanan Anda.
  3. Buat kode otorisasi untuk digunakan Google untuk mengakses API Anda. Kode otorisasi dapat berupa nilai string apa pun, tetapi harus secara unik mewakili pengguna, klien yang menjadi tujuan token, dan waktu kedaluwarsa kode, dan kode tersebut tidak boleh ditebak. Anda biasanya mengeluarkan kode otorisasi yang kedaluwarsa setelah sekitar 10 menit.
  4. Konfirmasi bahwa URL yang ditentukan oleh redirect_uri parameter memiliki bentuk sebagai berikut:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  5. Mengarahkan browser pengguna ke URL yang ditentukan oleh redirect_uri parameter. Sertakan kode otorisasi Anda hanya dihasilkan dan yang asli, dimodifikasi nilai negara ketika Anda mengarahkan dengan menambahkan code dan state parameter. Berikut ini adalah contoh dari URL yang dihasilkan:
    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING

Menangani permintaan pertukaran token

Titik akhir pertukaran token layanan Anda bertanggung jawab atas dua jenis pertukaran token:

  • Tukarkan kode otorisasi untuk token akses dan token penyegaran
  • Tukarkan token penyegaran untuk token akses

Permintaan pertukaran token mencakup parameter berikut:

Parameter titik akhir pertukaran token
client_id String yang mengidentifikasi asal permintaan sebagai Google. String ini harus terdaftar dalam sistem Anda sebagai pengenal unik Google.
client_secret String rahasia yang Anda daftarkan ke Google untuk layanan Anda.
grant_type Jenis token yang dipertukarkan. Ini baik authorization_code atau refresh_token .
code Ketika grant_type=authorization_code , parameter ini adalah kode Google yang diterima dari baik masuk atau pertukaran endpoint tanda.
redirect_uri Ketika grant_type=authorization_code , parameter ini adalah URL yang digunakan dalam permintaan otorisasi awal.
refresh_token Ketika grant_type=refresh_token , parameter ini adalah refresh tanda Google yang diterima dari endpoint pertukaran token Anda.
Tukarkan kode otorisasi untuk token akses dan token penyegaran

Setelah pengguna masuk dan titik akhir otorisasi Anda mengembalikan kode otorisasi yang berumur pendek ke Google, Google mengirimkan permintaan ke titik akhir pertukaran token Anda untuk menukar kode otorisasi dengan token akses dan token penyegaran.

Untuk permintaan ini, nilai grant_type adalah authorization_code , dan nilai code adalah nilai kode otorisasi sebelumnya Anda diberikan kepada Google. Berikut ini adalah contoh permintaan pertukaran kode otorisasi untuk token akses dan token penyegaran:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI

Untuk bertukar kode otorisasi untuk akses token dan refresh token, token Anda pertukaran endpoint merespon untuk POST permintaan dengan menjalankan langkah-langkah berikut:

  1. Verifikasi bahwa client_id mengidentifikasi permintaan asal sebagai asal berwenang, dan bahwa client_secret sesuai dengan nilai yang diharapkan.
  2. Verifikasi bahwa kode otorisasi valid dan tidak kedaluwarsa, dan bahwa ID klien yang ditentukan dalam permintaan cocok dengan ID klien yang terkait dengan kode otorisasi.
  3. Konfirmasi bahwa URL yang ditentukan oleh redirect_uri parameter identik dengan nilai yang digunakan dalam permintaan otorisasi awal.
  4. Jika Anda tidak dapat memverifikasi semua kriteria di atas, kembali HTTP 400 Bad Request kesalahan dengan {"error": "invalid_grant"} sebagai tubuh.
  5. Jika tidak, gunakan ID pengguna dari kode otorisasi untuk menghasilkan token penyegaran dan token akses. Token ini dapat berupa nilai string apa pun, tetapi harus secara unik mewakili pengguna dan klien yang menjadi tujuan token tersebut, dan tidak boleh dapat ditebak. Untuk token akses, catat juga waktu kedaluwarsa token, yang biasanya satu jam setelah Anda mengeluarkan token. Segarkan token tidak kedaluwarsa.
  6. Kembalikan JSON objek berikut dalam tubuh respon HTTPS:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "REFRESH_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }
    

Google menyimpan token akses dan token penyegaran untuk pengguna dan mencatat masa berlaku token akses. Saat token akses kedaluwarsa, Google menggunakan token penyegaran untuk mendapatkan token akses baru dari titik akhir pertukaran token Anda.

Tukarkan token penyegaran untuk token akses

Saat token akses kedaluwarsa, Google mengirimkan permintaan ke titik akhir pertukaran token Anda untuk menukar token penyegaran dengan token akses baru.

Untuk permintaan ini, nilai grant_type adalah refresh_token , dan nilai refresh_token adalah nilai refresh tanda sebelumnya diberikan kepada Google. Berikut ini adalah contoh permintaan untuk menukar token penyegaran dengan token akses:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

Untuk bertukar refresh tanda untuk token akses, token Anda pertukaran endpoint merespon untuk POST permintaan dengan menjalankan langkah-langkah berikut:

  1. Verifikasi bahwa client_id mengidentifikasi permintaan asal Google, dan bahwa client_secret sesuai dengan nilai yang diharapkan.
  2. Pastikan token penyegaran valid, dan ID klien yang ditentukan dalam permintaan cocok dengan ID klien yang terkait dengan token penyegaran.
  3. Jika Anda tidak dapat memverifikasi semua kriteria di atas, kembali HTTP 400 Bad Request kesalahan dengan {"error": "invalid_grant"} sebagai tubuh.
  4. Jika tidak, gunakan ID pengguna dari token penyegaran untuk menghasilkan token akses. Token ini dapat berupa nilai string apa pun, tetapi harus secara unik mewakili pengguna dan klien yang menjadi tujuan token tersebut, dan tidak boleh dapat ditebak. Untuk token akses, catat juga waktu kedaluwarsa token, biasanya satu jam setelah Anda mengeluarkan token.
  5. Kembalikan objek JSON berikut di badan respons HTTPS:
    {
    "token_type": "Bearer",
    "access_token": " ACCESS_TOKEN ",
    "expires_in": SECONDS_TO_EXPIRATION
    }
Menangani permintaan info pengguna

The userinfo endpoint adalah sumber daya yang dilindungi OAuth 2.0 bahwa klaim pengembalian tentang pengguna terkait. Menerapkan dan menghosting endpoint userinfo adalah opsional, kecuali untuk kasus penggunaan berikut:

Setelah token akses berhasil diambil dari titik akhir token Anda, Google mengirimkan permintaan ke titik akhir info pengguna Anda untuk mengambil informasi profil dasar tentang pengguna yang ditautkan.

header permintaan endpoint userinfo
Authorization header Token akses tipe Bearer.

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

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

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

  1. Ekstrak token akses dari header Otorisasi dan kembalikan informasi untuk pengguna yang terkait dengan token akses.
  2. Jika token akses tidak valid, mengembalikan HTTP 401 Unauthorized error dengan menggunakan WWW-Authenticate Respon header. Di bawah ini adalah contoh dari respon kesalahan userinfo:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    Jika 401 tidak sah, atau respon kesalahan yang gagal lainnya dikembalikan selama proses menghubungkan, kesalahan akan non-dipulihkan, token yang diambil akan dibuang dan pengguna akan memiliki untuk memulai proses penautan lagi.
  3. Jika token akses valid, kembali dan HTTP 200 respon dengan objek JSON berikut dalam tubuh respon HTTPS:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    
    Jika Anda userinfo titik akhir pengembalian respon sukses HTTP 200, diambil token dan klaim yang terdaftar terhadap pengguna Google Akun.

    tanggapan titik akhir info pengguna
    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 dari pengguna.
    picture Opsional: Gambar riwayat pengguna.

Memvalidasi implementasi

Anda dapat memvalidasi implementasi Anda dengan menggunakan OAuth 2.0 Playground alat.

Pada alat, lakukan langkah-langkah berikut:

  1. Klik Konfigurasi untuk membuka jendela Configuration OAuth 2.0.
  2. Di bidang aliran OAuth, pilih Client-side.
  3. Di bidang OAuth endpoint, pilih Custom.
  4. Tentukan titik akhir OAuth 2.0 dan ID klien yang Anda tetapkan ke Google di bidang yang sesuai.
  5. Pada bagian Langkah 1, tidak memilih lingkup Google. Sebagai gantinya, biarkan bidang ini kosong atau ketik cakupan yang valid untuk server Anda (atau string arbitrer jika Anda tidak menggunakan cakupan OAuth). Setelah selesai, klik Otorisasi API.
  6. Dalam Langkah 2 dan Langkah 3 bagian, melalui aliran OAuth 2.0 dan memverifikasi bahwa setiap langkah bekerja sebagaimana dimaksud.

Anda dapat memvalidasi implementasi Anda dengan menggunakan Akun Google Menghubungkan Demo alat.

Pada alat, lakukan langkah-langkah berikut:

  1. Klik Sign-in dengan tombol Google.
  2. Pilih akun yang ingin Anda tautkan.
  3. Masukkan ID layanan.
  4. Secara opsional, masukkan satu atau beberapa cakupan yang akan Anda minta aksesnya.
  5. Klik Mulai Demo.
  6. Saat diminta, konfirmasikan bahwa Anda dapat menyetujui dan menolak permintaan penautan.
  7. Konfirmasikan bahwa Anda dialihkan ke platform Anda.