Liên kết tài khoản với tính năng Đăng nhập bằng Google

Tính năng Đăng nhập bằng Google cho Trợ lý mang đến trải nghiệm người dùng đơn giản và dễ dàng nhất cho người dùng và nhà phát triển, cho cả việc liên kết tài khoản và tạo tài khoản. Hành động của bạn có thể yêu cầu quyền truy cập vào hồ sơ trên Google của người dùng trong một cuộc trò chuyện, bao gồm cả tên, địa chỉ email và ảnh hồ sơ của người dùng.

Thông tin hồ sơ có thể được dùng để tạo trải nghiệm người dùng được cá nhân hoá trong Hành động của bạn. Nếu có các ứng dụng trên các nền tảng khác và các ứng dụng đó sử dụng tính năng Đăng nhập bằng Google, thì bạn cũng có thể tìm và liên kết với tài khoản của người dùng hiện có, tạo tài khoản mới và thiết lập kênh liên lạc trực tiếp với người dùng đó.

Để liên kết tài khoản với tính năng Đăng nhập bằng Google, bạn cần yêu cầu người dùng đồng ý để truy cập vào hồ sơ của họ trên Google. Sau đó, bạn sử dụng thông tin trong hồ sơ của họ, chẳng hạn như địa chỉ email, để xác định người dùng trong hệ thống của bạn.

Triển khai liên kết tài khoản Đăng nhập bằng Google

Làm theo các bước trong những phần sau để thêm liên kết tài khoản Đăng nhập bằng Google vào Hành động của bạn.

Định cấu hình dự án

Để định cấu hình dự án nhằm sử dụng tính năng liên kết tài khoản Đăng nhập bằng Google, hãy làm theo các bước sau:

  1. Mở Bảng điều khiển Actions rồi chọn một dự án.
  2. Nhấp vào thẻ Phát triển rồi chọn Liên kết tài khoản.
  3. Bật nút chuyển bên cạnh Liên kết tài khoản.
  4. Trong phần Tạo tài khoản, hãy chọn .
  5. Trong Loại liên kết, hãy chọn Đăng nhập bằng Google.

  6. Mở Thông tin ứng dụng và ghi lại giá trị của Mã ứng dụng khách do Google cấp cho Hành động của bạn.

  7. Nhấp vào Lưu.

Thiết kế giao diện người dùng bằng giọng nói cho quy trình xác thực

Kiểm tra xem người dùng đã được xác minh hay chưa và bắt đầu quy trình liên kết tài khoản

  1. Mở dự án Trình tạo hành động trong Bảng điều khiển Actions.
  2. Tạo một cảnh mới để bắt đầu liên kết tài khoản trong Hành động của bạn:
    1. Nhấp vào Cảnh.
    2. Nhấp vào biểu tượng thêm (+) để thêm một cảnh mới.
  3. Trong cảnh mới tạo, hãy nhấp vào biểu tượng thêm cho Điều kiện.
  4. Thêm một điều kiện kiểm tra xem người dùng liên kết với cuộc trò chuyện có phải là người dùng đã xác minh hay không. Nếu quy trình kiểm tra không thành công, thì Hành động của bạn không thể thực hiện liên kết tài khoản trong cuộc trò chuyện và nên quay lại cung cấp quyền truy cập vào chức năng không yêu cầu liên kết tài khoản.
    1. Trong trường Enter new expression trong phần Điều kiện, hãy nhập logic sau: user.verificationStatus != "VERIFIED"
    2. Trong Chuyển đổi, hãy chọn một cảnh không yêu cầu liên kết tài khoản hoặc một cảnh là điểm truy cập vào chức năng chỉ dành cho khách.

  1. Nhấp vào biểu tượng thêm cho Điều kiện.
  2. Thêm điều kiện để kích hoạt quy trình liên kết tài khoản nếu người dùng không có danh tính được liên kết.
    1. Trong trường Enter new expression trong phần Điều kiện, hãy nhập logic sau: user.verificationStatus == "VERIFIED"
    2. Trong Chuyển đổi, hãy chọn cảnh hệ thống Liên kết tài khoản.
    3. Nhấp vào Lưu.

Sau khi lưu, một cảnh hệ thống liên kết tài khoản mới có tên là <SceneName>_AccountLinking sẽ được thêm vào dự án của bạn.

Tuỳ chỉnh cảnh liên kết tài khoản

  1. Trong Cảnh, hãy chọn cảnh hệ thống liên kết tài khoản.
  2. Nhấp vào Gửi lời nhắc rồi thêm một câu ngắn để mô tả cho người dùng lý do Hành động đó cần truy cập vào danh tính của họ (ví dụ: "Để lưu lựa chọn ưu tiên của bạn").
  3. Nhấp vào Lưu.

  1. Trong mục Điều kiện, hãy nhấp vào Nếu người dùng hoàn tất thành công quá trình liên kết tài khoản.
  2. Thiết lập cách quy trình diễn ra nếu người dùng đồng ý liên kết tài khoản của họ. Ví dụ: gọi webhook để xử lý mọi logic kinh doanh tuỳ chỉnh bắt buộc và chuyển đổi lại cảnh ban đầu.
  3. Nhấp vào Lưu.

  1. Trong mục Điều kiện, hãy nhấp vào Nếu người dùng huỷ hoặc huỷ quy trình liên kết tài khoản.
  2. Thiết lập cách quy trình diễn ra nếu người dùng không đồng ý liên kết tài khoản của họ. Ví dụ: gửi thông báo xác nhận và chuyển hướng đến các cảnh cung cấp chức năng không yêu cầu liên kết tài khoản.
  3. Nhấp vào Lưu.

  1. Trong mục Điều kiện, hãy nhấp vào Nếu xảy ra lỗi hệ thống hoặc mạng.
  2. Định cấu hình cách tiến hành của quy trình nếu quy trình liên kết tài khoản không thể hoàn tất do lỗi hệ thống hoặc mạng. Ví dụ: gửi thông báo xác nhận và chuyển hướng đến các cảnh cung cấp chức năng không yêu cầu liên kết tài khoản.
  3. Nhấp vào Lưu.

Truy cập vào thông tin hồ sơ trong phần phụ trợ

Sau khi người dùng cho phép hành động của bạn truy cập vào hồ sơ trên Google của họ, bạn sẽ nhận được một mã thông báo giá trị nhận dạng của Google chứa thông tin hồ sơ trên Google của người dùng trong mọi yêu cầu tiếp theo đối với hành động của bạn.

Để truy cập vào thông tin hồ sơ của người dùng, trước tiên, bạn cần xác thực và giải mã mã thông báo bằng cách làm như sau:

  1. Hãy dùng thư viện giải mã JWT cho ngôn ngữ của bạn để giải mã mã thông báo và sử dụng khoá công khai của Google (có sẵn ở định dạng JWK hoặc PEM) để xác minh chữ ký của mã thông báo.
  2. Xác minh rằng nhà phát hành mã thông báo (trường iss trong mã thông báo đã giải mã) là https://accounts.google.com và đối tượng (trường aud trong mã thông báo đã giải mã) là giá trị của Mã ứng dụng khách do Google cấp cho Hành động của bạn. Mã này được gán cho dự án của bạn trong bảng điều khiển Actions.

Sau đây là ví dụ về một mã thông báo đã giải mã:

{
  "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"
}

Nếu bạn sử dụng thư viện Actions on Google Fulfillment cho Node.js, thì thư viện này sẽ đảm nhận việc xác thực và giải mã mã thông báo, đồng thời cho phép bạn truy cập vào nội dung hồ sơ, như thể hiện trong các đoạn mã sau.

...
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;
      }
    }
  }
});

Xử lý các yêu cầu truy cập dữ liệu

Để xử lý yêu cầu truy cập dữ liệu, bạn chỉ cần xác minh rằng người dùng được mã thông báo mã nhận dạng của Google xác nhận đã có trong cơ sở dữ liệu. Đoạn mã sau đây cho thấy ví dụ về cách kiểm tra xem đơn đặt hàng của một người dùng đã tồn tại trong cơ sở dữ liệu Firestore hay chưa:

...
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!');
});