การลิงก์บัญชีกับ 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 ออกให้กับ Actions ซึ่งกำหนดให้กับโปรเจ็กต์ในคอนโซล Actions

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

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