Penautan akun dengan penautan "Login dengan Google" berbasis OAuth

Jenis penautan Login dengan Google berbasis OAuth "Sederhana" menambahkan Login dengan Google di atas penautan akun berbasis OAuth. Hal ini memberikan penautan berbasis suara yang lancar bagi pengguna Google sekaligus memungkinkan penautan akun bagi pengguna yang mendaftar ke layanan Anda dengan identitas non-Google.

Jenis penautan ini dimulai dengan Login dengan Google, yang memungkinkan Anda memeriksa apakah informasi profil Google pengguna ada di sistem Anda. Jika informasi pengguna tidak ditemukan di sistem Anda, alur OAuth standar akan dimulai. Pengguna juga dapat memilih untuk membuat akun baru dengan informasi profil Google mereka.

Gambar 1: Setelah Tindakan Anda mendapatkan akses ke profil Google pengguna, Anda dapat menggunakannya untuk menemukan kecocokan pengguna di sistem autentikasi Anda.

Untuk melakukan penautan akun dengan jenis penautan yang Disederhanakan, ikuti langkah-langkah umum berikut:

  1. Pertama, minta pengguna untuk memberikan izin akses ke profil Google mereka.
  2. Gunakan informasi di profilnya untuk mengidentifikasi pengguna.
  3. Jika Anda tidak dapat menemukan kecocokan untuk pengguna Google di sistem autentikasi Anda, alur akan berlanjut bergantung pada apakah Anda mengonfigurasi project Actions di konsol Actions untuk mengizinkan pembuatan akun pengguna melalui suara atau hanya di situs Anda.
    • Jika Anda mengizinkan pembuatan akun melalui suara, validasi token ID yang diterima dari Google. Kemudian, Anda dapat membuat pengguna berdasarkan informasi profil yang ada dalam token ID.
    • Jika Anda tidak mengizinkan pembuatan akun melalui suara, pengguna akan dialihkan ke browser tempat mereka dapat memuat halaman otorisasi Anda dan menyelesaikan alur pembuatan pengguna.
Jika Anda mengizinkan pembuatan akun melalui suara dan tidak dapat menemukan kecocokan untuk
            profil Google di sistem autentikasi Anda, Anda harus
            memvalidasi token ID yang diterima dari Google. Kemudian, Anda dapat membuat
            pengguna berdasarkan informasi profil yang ada dalam token ID.
            Jika Anda tidak mengizinkan pembuatan akun pengguna melalui suara, pengguna akan
            dialihkan ke browser tempat mereka dapat memuat halaman otorisasi Anda
            dan menyelesaikan alurnya.
Gambar 2. Representasi visual alur OAuth dan Login dengan Google saat informasi pengguna tidak ditemukan di sistem Anda.

Mendukung pembuatan akun melalui suara

Jika Anda mengizinkan pembuatan akun pengguna melalui suara, Asisten akan menanyakan kepada pengguna apakah mereka ingin melakukan hal berikut:

  • Buat akun baru di sistem Anda menggunakan informasi Akun Google mereka, atau
  • Login ke sistem autentikasi Anda dengan akun lain jika mereka memiliki akun non-Google yang sudah ada.

Sebaiknya izinkan pembuatan akun melalui suara jika Anda ingin meminimalkan hambatan alur pembuatan akun. Pengguna hanya perlu keluar dari alur suara jika ingin login menggunakan akun non-Google yang sudah ada.

Melarang pembuatan akun melalui suara

Jika Anda tidak mengizinkan pembuatan akun pengguna melalui suara, Asisten akan membuka URL ke situs yang Anda berikan untuk autentikasi pengguna. Jika interaksi terjadi di perangkat yang tidak memiliki layar, Asisten akan mengarahkan pengguna ke ponsel untuk melanjutkan alur penautan akun.

Pembuatan tidak diizinkan jika:

  • Anda tidak ingin mengizinkan pengguna yang memiliki akun non-Google untuk membuat akun pengguna baru dan ingin mereka menautkan ke akun pengguna yang ada di sistem autentikasi Anda. Misalnya, jika Anda menawarkan program loyalitas, Anda mungkin ingin memastikan bahwa pengguna tidak kehilangan poin yang diperoleh di akun yang sudah ada.

  • Anda harus memiliki kontrol penuh atas alur pembuatan akun. Misalnya, Anda dapat melarang pembuatan jika perlu menampilkan persyaratan layanan kepada pengguna selama pembuatan akun.

Menerapkan penautan "Sederhana" Login dengan Google berbasis OAuth

Akun ditautkan dengan alur OAuth 2.0 standar industri. Actions on Google mendukung alur kode otorisasi dan implisit.

Dalam alur kode implisit, Google membuka endpoint otorisasi Anda di browser pengguna. Setelah berhasil login, Anda akan menampilkan token akses berumur panjang ke Google. Token akses ini sekarang disertakan di setiap permintaan yang dikirim dari Asisten ke Action.

Dalam alur kode otorisasi, Anda membutuhkan dua endpoint:

  • Endpoint otorisasi, yang bertanggung jawab untuk menampilkan UI login kepada pengguna yang belum login, dan merekam izin untuk akses yang diminta dalam bentuk kode otorisasi yang memiliki masa aktif singkat.
  • Endpoint pertukaran token, yang bertanggung jawab atas dua jenis pertukaran:
    1. Menukarkan kode otorisasi dengan token refresh yang memiliki masa aktif lama dan token akses yang memiliki masa aktif singkat. Pertukaran ini terjadi saat pengguna melalui alur penautan akun.
    2. Menukarkan token refresh yang memiliki masa aktif lama dengan token akses yang memiliki masa aktif singkat. Pertukaran ini terjadi saat Google memerlukan token akses baru karena masa berlakunya telah berakhir.

Meskipun alur kode implisit lebih mudah diimplementasikan, Google merekomendasikan agar token akses yang dikeluarkan menggunakan alur implisit tidak pernah kedaluwarsa, karena menggunakan masa berlaku token dengan alur implisit akan memaksa pengguna untuk menautkan akunnya lagi. Jika Anda memerlukan masa berlaku token untuk alasan keamanan, Anda harus mempertimbangkan penggunaan alur kode autentikasi.

Mengonfigurasi project

Untuk mengonfigurasi project Anda agar menggunakan Penautan yang disederhanakan, ikuti langkah-langkah berikut:

  1. Buka Konsol Actions, lalu pilih project yang ingin Anda gunakan.
  2. Klik tab Kembangkan, lalu pilih Penautan akun.
  3. Aktifkan tombol di samping Penautan akun.
  4. Di bagian Pembuatan akun, pilih Ya.

  5. Di Linking type, pilih OAuth & Google Sign In dan Implicit.

  6. Di Client Information, lakukan hal berikut:

    • Tetapkan nilai ke Client ID yang dikeluarkan oleh Actions on Google untuk mengidentifikasi permintaan yang berasal dari Google.
    • Masukkan URL untuk endpoint Otorisasi dan Pertukaran Token Anda.
  7. Klik Simpan.

Menerapkan server OAuth Anda

To support the OAuth 2.0 implicit flow, your service makes an authorization endpoint available by HTTPS. This endpoint is responsible for authenticating and obtaining consent from users for data access. The authorization endpoint presents a sign-in UI to your users that aren't already signed in and records consent to the requested access.

When your Action needs to call one of your service's authorized APIs, Google uses this endpoint to get permission from your users to call these APIs on their behalf.

A typical OAuth 2.0 implicit flow session initiated by Google has the following flow:

  1. Google opens your authorization endpoint in the user's browser. The user signs in if not signed in already, and grants Google permission to access their data with your API if they haven't already granted permission.
  2. Your service creates an access token and returns it to Google by redirecting the user's browser back to Google with the access token attached to the request.
  3. Google calls your service's APIs, and attaches the access token with each request. Your service verifies that the access token grants Google authorization to access the API and then completes the API call.

Handle authorization requests

When your Action needs to perform account linking via an OAuth 2.0 implicit flow, Google sends the user to your authorization endpoint with a request that includes the following parameters:

Authorization endpoint parameters
client_id The client ID you assigned to Google.
redirect_uri The URL to which you send the response to this request.
state A bookkeeping value that is passed back to Google unchanged in the redirect URI.
response_type The type of value to return in the response. For the OAuth 2.0 implicit flow, the response type is always token.

For example, if your authorization endpoint is available at https://myservice.example.com/auth, a request might look like:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token

For your authorization endpoint to handle sign-in requests, do the following steps:

  1. Verify the client_id and redirect_uri values to prevent granting access to unintended or misconfigured client apps:

    • Confirm that the client_id matches the client ID you assigned to Google.
    • Confirm that the URL specified by the redirect_uri parameter has the following form:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      YOUR_PROJECT_ID is the ID found on the Project settings page of the Actions Console.
  2. Check if the user is signed in to your service. If the user isn't signed in, complete your service's sign-in or sign-up flow.

  3. Generate an access token that Google will use to access your API. The access token can be any string value, but it must uniquely represent the user and the client the token is for and must not be guessable.

  4. Send an HTTP response that redirects the user's browser to the URL specified by the redirect_uri parameter. Include all of the following parameters in the URL fragment:

    • access_token: the access token you just generated
    • token_type: the string bearer
    • state: the unmodified state value from the original request The following is an example of the resulting URL:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Google's OAuth 2.0 redirect handler will receive the access token and confirm that the state value hasn't changed. After Google has obtained an access token for your service, Google will attach the token to subsequent calls to your Action as part of the AppRequest.

Handle automatic linking

After the user gives your Action consent to access their Google profile, Google sends a request that contains a signed assertion of the Google user's identity. The assertion contains information that includes the user's Google Account ID, name, and email address. The token exchange endpoint configured for your project handles that request.

If the corresponding Google account is already present in your authentication system, your token exchange endpoint returns a token for the user. If the Google account doesn't match an existing user, your token exchange endpoint returns a user_not_found error.

The request has the following form:

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

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&consent_code=CONSENT_CODE&scope=SCOPES

Your token exchange endpoint must be able to handle the following parameters:

Token endpoint parameters
grant_type The type of token being exchanged. For these requests, this parameter has the value urn:ietf:params:oauth:grant-type:jwt-bearer.
intent For these requests, the value of this parameter is `get`.
assertion A JSON Web Token (JWT) that provides a signed assertion of the Google user's identity. The JWT contains information that includes the user's Google Account ID, name, and email address.
consent_code Optional: When present, a one-time code that indicates that the user has granted consent for your Action to access the specified scopes.
scope Optional: Any scopes you configured Google to request from users.

When your token exchange endpoint receives the linking request, it should do the following:

Memvalidasi dan mendekode pernyataan JWT

Anda dapat memvalidasi dan mendekode pernyataan JWT menggunakan library decoding JWT untuk bahasa Anda. Gunakan kunci publik Google (tersedia di JWK atau PEM) untuk memverifikasi tanda tangan.

Saat didekode, pernyataan JWT akan terlihat seperti contoh berikut:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "locale": "en_US"
}

Selain memverifikasi tanda tangan token, verifikasi bahwa penerbit pernyataan (kolom iss) adalah https://accounts.google.com dan bahwa audiens (kolom aud) adalah client ID yang ditetapkan untuk Action Anda.

Check if the Google account is already present in your authentication system

Check whether either of the following conditions are true:

  • The Google Account ID, found in the assertion's sub field, is in your user database.
  • The email address in the assertion matches a user in your user database.

If either condition is true, the user has already signed up and you can issue an access token.

If neither the Google Account ID nor the email address specified in the assertion matches a user in your database, the user hasn't signed up yet. In this case, your token exchange endpoint should reply with a HTTP 401 error, that specifies error=user_not_found, as in the following example:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"user_not_found",
}
When Google receives the 401 error response with a user_not_found error, Google calls your token exchange endpoint with the value of the intent parameter set to create and sending an ID token that contains the user's profile information with the request.

Menangani pembuatan akun melalui Login dengan Google

Saat pengguna perlu membuat akun di layanan Anda, Google akan membuat permintaan ke endpoint pertukaran token yang menentukan intent=create, seperti dalam contoh berikut:

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

response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&consent_code=CONSENT_CODE&assertion=JWT[&NEW_ACCOUNT_INFO]

Parameter assertion berisi Token Web JSON (JWT) yang menyediakan pernyataan bertanda tangan tentang identitas pengguna Google. JWT berisi informasi yang mencakup ID Akun Google, nama, dan alamat email pengguna, yang dapat Anda gunakan untuk membuat akun baru di layanan Anda.

Untuk merespons permintaan pembuatan akun, endpoint pertukaran token Anda harus memiliki hal berikut:

Memvalidasi dan mendekode pernyataan JWT

Anda dapat memvalidasi dan mendekode pernyataan JWT menggunakan library decoding JWT untuk bahasa Anda. Gunakan kunci publik Google (tersedia di JWK atau PEM) untuk memverifikasi tanda tangan.

Saat didekode, pernyataan JWT akan terlihat seperti contoh berikut:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "locale": "en_US"
}

Selain memverifikasi tanda tangan token, verifikasi bahwa penerbit pernyataan (kolom iss) adalah https://accounts.google.com dan bahwa audiens (kolom aud) adalah client ID yang ditetapkan untuk Action Anda.

Memvalidasi informasi pengguna dan membuat akun baru

Periksa apakah salah satu kondisi berikut terpenuhi:

  • ID Akun Google yang ada di kolom sub pernyataan berada di database pengguna Anda.
  • Alamat email dalam pernyataan cocok dengan pengguna di database pengguna Anda.

Jika salah satu kondisinya benar, minta pengguna menautkan akun mereka yang sudah ada dengan ke Akun Google mereka dengan merespons permintaan melalui error HTTP 401, error=linking_error dan alamat email pengguna sebagai login_hint, seperti pada contoh berikut:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

Jika tidak satu pun kondisinya benar, buat akun pengguna baru menggunakan informasi tersebut yang disediakan di JWT. Akun baru biasanya tidak memiliki sandi yang disetel. Penting sebaiknya tambahkan Login dengan Google ke platform lain agar pengguna dapat login melalui Google di seluruh platform aplikasi Anda. Atau, Anda dapat mengirimkan email kepada pengguna tautan yang memulai alur pemulihan sandi Anda untuk memungkinkan pengguna mengatur {i>password<i} untuk masuk di platform lain.

Setelah pembuatan selesai, keluarkan token akses , lalu tampilkan nilai dalam objek JSON di isi respons HTTPS, seperti dalam contoh berikut:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",
  
  "expires_in": SECONDS_TO_EXPIRATION
}

Mendesain antarmuka pengguna suara untuk alur autentikasi

Periksa apakah pengguna sudah diverifikasi dan mulai alur penautan akun

  1. Buka project Actions Builder Anda di Konsol Actions.
  2. Buat adegan baru untuk memulai penautan akun di Action Anda:
    1. Klik Adegan.
    2. Klik ikon tambahkan (+) untuk menambahkan adegan baru.
  3. Di adegan yang baru dibuat, klik ikon tambah untuk Kondisi.
  4. Tambahkan kondisi yang memeriksa apakah pengguna yang terkait dengan percakapan adalah pengguna terverifikasi. Jika pemeriksaan gagal, Action Anda tidak dapat melakukan penautan akun selama percakapan, dan harus kembali ke penyediaan akses ke fungsi yang tidak memerlukan penautan akun.
    1. Di kolom Enter new expression pada bagian Kondisi, masukkan logika berikut: user.verificationStatus != "VERIFIED"
    2. Di bagian Transisi, pilih adegan yang tidak memerlukan penautan akun atau adegan yang merupakan titik entri ke fungsi khusus tamu.

  1. Klik ikon tambah untuk Kondisi.
  2. Tambahkan kondisi untuk memicu alur penautan akun jika pengguna tidak memiliki identitas terkait.
    1. Di kolom Enter new expression pada bagian Kondisi, masukkan logika berikut: user.verificationStatus == "VERIFIED"
    2. Di bagian Transisi, pilih adegan sistem Penautan Akun.
    3. Klik Simpan.

Setelah disimpan, adegan sistem penautan akun baru bernama <SceneName>_AccountLinking ditambahkan ke project Anda.

Menyesuaikan adegan penautan akun

  1. Di bagian Scenes, pilih adegan sistem penautan akun.
  2. Klik Kirim perintah dan tambahkan kalimat singkat untuk menjelaskan kepada pengguna mengapa Tindakan perlu mengakses identitas mereka (misalnya "Untuk menyimpan preferensi Anda").
  3. Klik Simpan.

  1. Di bagian Kondisi, klik Jika pengguna berhasil menyelesaikan penautan akun.
  2. Konfigurasi cara alur harus dilanjutkan jika pengguna setuju untuk menautkan akunnya. Misalnya, panggil webhook untuk memproses logika bisnis kustom yang diperlukan dan kembali ke scene asal.
  3. Klik Simpan.

  1. Di bagian Kondisi, klik Jika pengguna membatalkan atau menutup penautan akun.
  2. Konfigurasi cara alur harus dilanjutkan jika pengguna tidak setuju untuk menautkan akunnya. Misalnya, kirim pesan konfirmasi dan alihkan ke adegan yang menyediakan fungsi yang tidak memerlukan penautan akun.
  3. Klik Simpan.

  1. Di bagian Kondisi, klik Jika terjadi error sistem atau jaringan.
  2. Konfigurasi cara alur harus dilanjutkan jika alur penautan akun tidak dapat diselesaikan karena error sistem atau jaringan. Misalnya, kirim pesan konfirmasi dan alihkan ke adegan yang menyediakan fungsi yang tidak memerlukan penautan akun.
  3. Klik Simpan.

Menangani permintaan akses data

Jika permintaan Asisten berisi token akses, periksa terlebih dahulu apakah token akses valid dan tidak kedaluwarsa, lalu ambil dari database akun pengguna Anda akun pengguna yang terkait dengan token tersebut.