การลิงก์บัญชีกับ Google Sign-In

Google Sign-In สำหรับ Assistant มอบประสบการณ์ของผู้ใช้ที่ง่ายและสะดวกที่สุด ทั้งผู้ใช้และนักพัฒนาซอฟต์แวร์สำหรับการลิงก์บัญชีและการสร้างบัญชี การดำเนินการของคุณ สามารถขอสิทธิ์เข้าถึงโปรไฟล์ Google ของผู้ใช้ในระหว่างการสนทนา รวมถึงชื่อ อีเมล และรูปโปรไฟล์ของผู้ใช้

สามารถใช้ข้อมูลโปรไฟล์เพื่อสร้างประสบการณ์ที่ปรับเปลี่ยนในแบบของผู้ใช้ได้ ในการดําเนินการของคุณ หากคุณมีแอปในแพลตฟอร์มอื่นๆ ที่แอปเหล่านั้นใช้ Google Sign-In คุณยังสามารถค้นหาและลิงก์กับบัญชีของผู้ใช้ที่มีอยู่ สร้างบัญชีใหม่ และสร้างช่องทางการสื่อสารโดยตรงกับผู้ใช้

คุณต้องขอให้ผู้ใช้ให้ความยินยอมเพื่อทำการลิงก์บัญชีกับ Google Sign-In เข้าถึงโปรไฟล์ Google ของตนเอง จากนั้นใช้ข้อมูลในโปรไฟล์ของผู้ใช้เพื่อ เช่น ที่อยู่อีเมล เพื่อระบุผู้ใช้ในระบบของคุณ

ใช้การลิงก์บัญชี Google Sign-In

ทําตามขั้นตอนในส่วนต่อไปนี้เพื่อเพิ่มการลิงก์บัญชี Google Sign-In กับ แอ็กชัน

กำหนดค่าโปรเจ็กต์

หากต้องการกำหนดค่าโปรเจ็กต์ให้ใช้การลิงก์บัญชี Google Sign-In ให้ทำตามขั้นตอนต่อไปนี้

  1. เปิดคอนโซล Actions และเลือกโปรเจ็กต์
  2. คลิกแท็บพัฒนา แล้วเลือกการลิงก์บัญชี
  3. เปิดใช้สวิตช์ข้างการลิงก์บัญชี
  4. ในส่วนการสร้างบัญชี ให้เลือกใช่
  5. ในส่วนประเภทการลิงก์ ให้เลือก Google Sign In

  6. เปิดข้อมูลลูกค้า และจดบันทึกค่าของรหัสไคลเอ็นต์ที่ Google ออกให้กับการดำเนินการของคุณ

  7. คลิกบันทึก

ออกแบบอินเทอร์เฟซผู้ใช้แบบเสียงสำหรับขั้นตอนการตรวจสอบสิทธิ์

ตรวจสอบว่าผู้ใช้ได้รับการยืนยันหรือไม่ และเริ่มขั้นตอนการลิงก์บัญชี

  1. เปิดโปรเจ็กต์ Actions Builder ในคอนโซล Actions
  2. สร้างฉากใหม่เพื่อเริ่มลิงก์บัญชีใน Action
    1. คลิกฉาก
    2. คลิกไอคอนเพิ่ม (+) เพื่อเพิ่มฉากใหม่
  3. ในฉากที่สร้างขึ้นใหม่ ให้คลิกเพิ่ม ไอคอนสำหรับเงื่อนไข
  4. เพิ่มเงื่อนไขที่ตรวจสอบว่าผู้ใช้ที่เชื่อมโยงกับการสนทนาเป็น ผู้ใช้ที่ได้รับการยืนยัน หากตรวจสอบไม่สำเร็จ แสดงว่าการดำเนินการลิงก์บัญชีไม่ได้ ในระหว่างการสนทนา และควรกลับไปใช้การให้สิทธิ์เข้าถึง ฟังก์ชันที่ไม่ต้องลิงก์บัญชี
    1. ในช่อง Enter new expression ในส่วนเงื่อนไข ให้ป้อนตรรกะต่อไปนี้ user.verificationStatus != "VERIFIED"
    2. ในส่วนการเปลี่ยน ให้เลือกฉากที่ไม่ต้องมีการลิงก์บัญชี หรือ ฉากที่เป็นจุดแรกเข้าเพื่อเข้าสู่ฟังก์ชันการทำงานของแขกเท่านั้น

  1. คลิกไอคอนเพิ่ม สําหรับเงื่อนไข
  2. เพิ่มเงื่อนไขเพื่อทริกเกอร์ขั้นตอนการลิงก์บัญชีหากผู้ใช้ไม่มี ข้อมูลประจำตัวที่เกี่ยวข้อง
    1. ในช่อง Enter new expression ในส่วนเงื่อนไข ให้ป้อนตรรกะต่อไปนี้ user.verificationStatus == "VERIFIED"
    2. ในส่วนการเปลี่ยน ให้เลือกฉากระบบการลิงก์บัญชี
    3. คลิกบันทึก

หลังจากบันทึกแล้ว โหมดระบบลิงก์บัญชีใหม่ที่เรียกว่า <SceneName>_AccountLinking ลงในโปรเจ็กต์ของคุณ

ปรับแต่งฉากการลิงก์บัญชี

  1. ในส่วนฉาก ให้เลือกฉากของระบบการลิงก์บัญชี
  2. คลิกส่งข้อความแจ้ง แล้วเพิ่มประโยคสั้นๆ เพื่ออธิบายแก่ผู้ใช้ ทำไมการดำเนินการจึงจำเป็นต้องเข้าถึงข้อมูลประจำตัว (เช่น "เพื่อบันทึกค่ากำหนดของคุณ")
  3. คลิกบันทึก

  1. ในส่วนเงื่อนไข ให้คลิกหากผู้ใช้ลิงก์บัญชีเรียบร้อยแล้ว
  2. กำหนดค่าว่าจะดำเนินการอย่างไรต่อไปหากผู้ใช้ตกลงที่จะลิงก์บัญชีของตน เช่น เรียกใช้เว็บฮุคเพื่อประมวลผลตรรกะทางธุรกิจที่กำหนดเองที่จำเป็น และเปลี่ยนกลับไปยังฉากต้นทาง
  3. คลิกบันทึก

  1. ในส่วนเงื่อนไข ให้คลิกหากผู้ใช้ยกเลิกหรือปิดการลิงก์บัญชี
  2. กำหนดค่าว่าจะดำเนินการอย่างไรต่อไปหากผู้ใช้ไม่ยินยอมที่จะลิงก์ ของคุณได้ เช่น ส่งข้อความรับทราบและเปลี่ยนเส้นทางไปยังฉาก ซึ่งมีฟังก์ชันที่ไม่ต้องลิงก์บัญชี
  3. คลิกบันทึก

  1. ในส่วนเงื่อนไข ให้คลิกหากเกิดข้อผิดพลาดของระบบหรือเครือข่าย
  2. กำหนดค่าว่าจะดำเนินการอย่างไรต่อหากไม่สามารถลิงก์บัญชี เสร็จสมบูรณ์เนื่องจากข้อผิดพลาดของระบบหรือเครือข่าย เช่น ส่งข้อความรับทราบและเปลี่ยนเส้นทางไปยังฉาก ซึ่งมีฟังก์ชันที่ไม่ต้องลิงก์บัญชี
  3. คลิกบันทึก

เข้าถึงข้อมูลโปรไฟล์ในแบ็กเอนด์ของคุณ

หลังจากผู้ใช้ให้สิทธิ์การทำงานของคุณในการเข้าถึงโปรไฟล์ Google ของตน คุณจะได้รับ โทเค็นรหัส Google ที่มีข้อมูลโปรไฟล์ Google ของผู้ใช้ในทุกๆ หน้า คำขอให้ดำเนินการของคุณ

หากต้องการเข้าถึงข้อมูลโปรไฟล์ของผู้ใช้ คุณจะต้องตรวจสอบและถอดรหัสโทเค็นก่อน โดยทำดังนี้

  1. ใช้ไลบรารีการถอดรหัส JWT สำหรับภาษาของคุณเพื่อถอดรหัส โทเค็น และใช้คีย์สาธารณะของ Google (พร้อมใช้งานใน JWK หรือรูปแบบ PEM) เพื่อยืนยันลายเซ็นของโทเค็น
  2. ยืนยันว่าผู้ออกโทเค็น (ช่อง iss ในโทเค็นที่ถอดรหัสแล้ว) คือ https://accounts.google.com และกลุ่มเป้าหมาย (ช่อง aud ในโทเค็นถอดรหัส) เป็นค่าของ รหัสไคลเอ็นต์ที่ Google ออกให้กับการดำเนินการของคุณ ซึ่งกำหนดให้กับโปรเจ็กต์ของคุณ ในคอนโซลการดำเนินการ

ต่อไปนี้เป็นตัวอย่างของโทเค็นที่ถอดรหัส

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

หากคุณใช้ไลบรารี Actions on Google Fulfillment สำหรับ Node.js จะดูแลการตรวจสอบและถอดรหัสโทเค็นให้คุณ รวมทั้งให้สิทธิ์การเข้าถึง เนื้อหาโปรไฟล์ ดังที่แสดงในข้อมูลโค้ดต่อไปนี้

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

จัดการคำขอเข้าถึงข้อมูล

หากต้องการจัดการคำขอเข้าถึงข้อมูล เพียงยืนยันว่าผู้ใช้ยืนยันด้วยรหัส Google แล้ว มีโทเค็นอยู่แล้วในฐานข้อมูล ข้อมูลโค้ดต่อไปนี้แสดง ตัวอย่างวิธีตรวจสอบว่าคำสั่งซื้อสำหรับผู้ใช้มีอยู่แล้วในฐานข้อมูล 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!');
});