Penautan akun dengan Login dengan Google

Login dengan Google untuk Asisten memberikan pengalaman pengguna yang paling sederhana dan mudah bagi pengguna dan developer, baik untuk penautan akun maupun pembuatan akun. Action Anda dapat meminta akses ke profil Google pengguna selama percakapan, termasuk nama, alamat email, dan foto profil pengguna.

Informasi profil dapat digunakan untuk menciptakan pengalaman pengguna yang dipersonalisasi dalam Action Anda. Jika Anda memiliki aplikasi di platform lain dan aplikasi tersebut menggunakan Login dengan Google, Anda juga dapat menemukan dan menautkan ke akun pengguna yang ada, membuat akun baru, dan membuat saluran komunikasi langsung ke pengguna.

Untuk melakukan penautan akun dengan Login dengan Google, Anda meminta pengguna memberikan izin untuk mengakses profil Google mereka. Kemudian, Anda menggunakan informasi di profil mereka, misalnya alamat email, untuk mengidentifikasi pengguna di sistem Anda.

Menerapkan penautan akun Login dengan Google

Ikuti langkah-langkah di bagian berikut untuk menambahkan penautan akun Login dengan Google ke Action Anda.

Mengonfigurasi project

Untuk mengonfigurasi project Anda agar menggunakan penautan akun Login dengan Google, ikuti langkah-langkah berikut:

  1. Buka Konsol Actions dan pilih project.
  2. Klik tab Develop dan pilih Account linking.
  3. Aktifkan tombol di samping Penautan akun.
  4. Di bagian Pembuatan akun, pilih Ya.
  5. Di Linking type, pilih Google Sign In.

  6. Buka Informasi Klien dan catat nilai ID Klien yang dikeluarkan oleh Google untuk Action Anda.

  7. Klik Simpan.

Mendesain antarmuka pengguna suara untuk alur autentikasi

Periksa apakah pengguna telah diverifikasi dan mulai alur penautan akun

  1. Buka project Action Builder Anda di Konsol Actions.
  2. Buat scene baru untuk memulai penautan akun di Action Anda:
    1. Klik Scene.
    2. Klik ikon add (+) untuk menambahkan adegan baru.
  3. Pada scene yang baru dibuat, klik ikon tambahkan 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 menyediakan 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 Transition, pilih scene yang tidak memerlukan penautan akun atau scene yang merupakan titik entri ke fungsi khusus tamu.

  1. Klik ikon tambahkan 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 scene sistem Penautan Akun.
    3. Klik Simpan.

Setelah disimpan, scene sistem penautan akun baru yang disebut <SceneName>_AccountLinking akan ditambahkan ke project Anda.

Menyesuaikan adegan penautan akun

  1. Di bagian Scene, pilih scene sistem penautan akun.
  2. Klik Kirim perintah dan tambahkan kalimat singkat untuk menjelaskan kepada pengguna alasan Action 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 berjalan jika pengguna setuju untuk menautkan akun mereka. Misalnya, panggil webhook untuk memproses logika bisnis kustom yang diperlukan dan lakukan transisi kembali ke scene asal.
  3. Klik Simpan.

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

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

Mengakses informasi profil di backend Anda

Setelah pengguna mengizinkan tindakan Anda untuk mengakses profil Google-nya, Anda akan menerima token ID Google yang berisi informasi profil Google pengguna dalam setiap permintaan berikutnya atas tindakan Anda.

Untuk mengakses informasi profil pengguna, Anda harus terlebih dahulu memvalidasi dan mendekode token dengan melakukan hal berikut:

  1. Gunakan library dekode JWT untuk bahasa Anda guna mendekode token, dan gunakan kunci publik Google (tersedia dalam format JWK atau PEM) untuk memverifikasi tanda tangan token.
  2. Pastikan penerbit token (kolom iss dalam token yang didekode) adalah https://accounts.google.com dan audiens (kolom aud dalam token yang didekode) adalah nilai Client ID yang dikeluarkan oleh Google ke Actions Anda, yang ditetapkan ke project Anda di konsol Actions.

Berikut adalah contoh token yang didekode:

{
  "sub": 1234567890,        // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The token's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Client ID assigned to your Actions project
  "iat": 233366400,         // Unix timestamp of the token's creation time
  "exp": 233370000,         // Unix timestamp of the token'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"
}

Jika Anda menggunakan library Actions on Google Fulfillment untuk Node.js, library ini akan memvalidasi dan mendekode token untuk Anda, serta memberi Anda akses ke konten profil, seperti yang ditunjukkan dalam cuplikan kode berikut.

...
const app = conversation({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
...
// Invoked on successful completion of account linking flow, check if we need to
// create a Firebase user.
app.handle('linkAccount', async conv => {
  let payload = conv.headers.authorization;
  if (payload) {
  // Get UID for Firebase auth user using the email of the user
    const email = payload.email;
    if (!conv.user.params.uid && email) {
      try {
        conv.user.params.uid = (await auth.getUserByEmail(email)).uid;
      } catch (e) {
        if (e.code !== 'auth/user-not-found') {
          throw e;
        }
        // If the user is not found, create a new Firebase auth user
        // using the email obtained from Google Assistant
        conv.user.params.uid = (await auth.createUser({email})).uid;
      }
    }
  }
});

Menangani permintaan akses data

Untuk menangani permintaan akses data, cukup verifikasi bahwa pengguna yang dinyatakan oleh token ID Google sudah ada di database Anda. Cuplikan kode berikut menunjukkan contoh cara memeriksa apakah pesanan untuk pengguna sudah ada di database Firestore:

...
app.handle('Place_Order', async conv => {
  const order = conv.session.params.order;
  const userDoc = dbs.user.doc(conv.user.params.uid);
  const orderHistory = userDoc.collection("orderHistory");
  if (orderHistory) {
    // Order history exists, so the user already placed an order.
    // Update counter for order type.
    await orderHistory.doc(order).update({ count: admin.firestore.FieldValue.increment(1)});
  } else {
    // First order they place
    await orderHistory.doc(order).set({ option: order, count: 1});
    options.forEach(opt => {
      if (opt != order) {
        orderHistory.doc(opt).set({ option: opt, count: 0});
      }
    });
  }
  return conv.add(`Your ${order} has been placed. ` +
      'Thanks for using Boba Bonanza, see you soon!');
});