Google Sign-In สำหรับ Assistant มอบประสบการณ์ของผู้ใช้ที่ง่ายและสะดวกที่สุด ทั้งผู้ใช้และนักพัฒนาซอฟต์แวร์สำหรับการลิงก์บัญชีและการสร้างบัญชี การดำเนินการของคุณ สามารถขอสิทธิ์เข้าถึงโปรไฟล์ Google ของผู้ใช้ในระหว่างการสนทนา รวมถึงชื่อ อีเมล และรูปโปรไฟล์ของผู้ใช้
สามารถใช้ข้อมูลโปรไฟล์เพื่อสร้างประสบการณ์ที่ปรับเปลี่ยนในแบบของผู้ใช้ได้ ในการดําเนินการของคุณ หากคุณมีแอปในแพลตฟอร์มอื่นๆ ที่แอปเหล่านั้นใช้ Google Sign-In คุณยังสามารถค้นหาและลิงก์กับบัญชีของผู้ใช้ที่มีอยู่ สร้างบัญชีใหม่ และสร้างช่องทางการสื่อสารโดยตรงกับผู้ใช้
คุณต้องขอให้ผู้ใช้ให้ความยินยอมเพื่อทำการลิงก์บัญชีกับ Google Sign-In เข้าถึงโปรไฟล์ Google ของตนเอง จากนั้นใช้ข้อมูลในโปรไฟล์ของผู้ใช้เพื่อ เช่น ที่อยู่อีเมล เพื่อระบุผู้ใช้ในระบบของคุณ
ใช้การลิงก์บัญชี Google Sign-In
ทําตามขั้นตอนในส่วนต่อไปนี้เพื่อเพิ่มการลิงก์บัญชี Google Sign-In กับ แอ็กชัน
กำหนดค่าโปรเจ็กต์
หากต้องการกำหนดค่าโปรเจ็กต์ให้ใช้การลิงก์บัญชี Google Sign-In ให้ทำตามขั้นตอนต่อไปนี้
- เปิดคอนโซล Actions และเลือกโปรเจ็กต์
- คลิกแท็บพัฒนา แล้วเลือกการลิงก์บัญชี
- เปิดใช้สวิตช์ข้างการลิงก์บัญชี
- ในส่วนการสร้างบัญชี ให้เลือกใช่
ในส่วนประเภทการลิงก์ ให้เลือก Google Sign In
เปิดข้อมูลลูกค้า และจดบันทึกค่าของรหัสไคลเอ็นต์ที่ Google ออกให้กับการดำเนินการของคุณ
คลิกบันทึก
ออกแบบอินเทอร์เฟซผู้ใช้แบบเสียงสำหรับขั้นตอนการตรวจสอบสิทธิ์
ตรวจสอบว่าผู้ใช้ได้รับการยืนยันหรือไม่ และเริ่มขั้นตอนการลิงก์บัญชี
- เปิดโปรเจ็กต์ Actions Builder ในคอนโซล Actions
- สร้างฉากใหม่เพื่อเริ่มลิงก์บัญชีใน Action
- คลิกฉาก
- คลิกไอคอนเพิ่ม (+) เพื่อเพิ่มฉากใหม่
- ในฉากที่สร้างขึ้นใหม่ ให้คลิกเพิ่ม add ไอคอนสำหรับเงื่อนไข
- เพิ่มเงื่อนไขที่ตรวจสอบว่าผู้ใช้ที่เชื่อมโยงกับการสนทนาเป็น
ผู้ใช้ที่ได้รับการยืนยัน หากตรวจสอบไม่สำเร็จ แสดงว่าการดำเนินการลิงก์บัญชีไม่ได้
ในระหว่างการสนทนา และควรกลับไปใช้การให้สิทธิ์เข้าถึง
ฟังก์ชันที่ไม่ต้องลิงก์บัญชี
- ในช่อง
Enter new expression
ในส่วนเงื่อนไข ให้ป้อนตรรกะต่อไปนี้user.verificationStatus != "VERIFIED"
- ในส่วนการเปลี่ยน ให้เลือกฉากที่ไม่ต้องมีการลิงก์บัญชี หรือ ฉากที่เป็นจุดแรกเข้าเพื่อเข้าสู่ฟังก์ชันการทำงานของแขกเท่านั้น
- ในช่อง
- คลิกไอคอนเพิ่ม add สําหรับเงื่อนไข
- เพิ่มเงื่อนไขเพื่อทริกเกอร์ขั้นตอนการลิงก์บัญชีหากผู้ใช้ไม่มี
ข้อมูลประจำตัวที่เกี่ยวข้อง
- ในช่อง
Enter new expression
ในส่วนเงื่อนไข ให้ป้อนตรรกะต่อไปนี้user.verificationStatus == "VERIFIED"
- ในส่วนการเปลี่ยน ให้เลือกฉากระบบการลิงก์บัญชี
- คลิกบันทึก
- ในช่อง
หลังจากบันทึกแล้ว โหมดระบบลิงก์บัญชีใหม่ที่เรียกว่า <SceneName>_AccountLinking
ลงในโปรเจ็กต์ของคุณ
ปรับแต่งฉากการลิงก์บัญชี
- ในส่วนฉาก ให้เลือกฉากของระบบการลิงก์บัญชี
- คลิกส่งข้อความแจ้ง แล้วเพิ่มประโยคสั้นๆ เพื่ออธิบายแก่ผู้ใช้ ทำไมการดำเนินการจึงจำเป็นต้องเข้าถึงข้อมูลประจำตัว (เช่น "เพื่อบันทึกค่ากำหนดของคุณ")
- คลิกบันทึก
- ในส่วนเงื่อนไข ให้คลิกหากผู้ใช้ลิงก์บัญชีเรียบร้อยแล้ว
- กำหนดค่าว่าจะดำเนินการอย่างไรต่อไปหากผู้ใช้ตกลงที่จะลิงก์บัญชีของตน เช่น เรียกใช้เว็บฮุคเพื่อประมวลผลตรรกะทางธุรกิจที่กำหนดเองที่จำเป็น และเปลี่ยนกลับไปยังฉากต้นทาง
- คลิกบันทึก
- ในส่วนเงื่อนไข ให้คลิกหากผู้ใช้ยกเลิกหรือปิดการลิงก์บัญชี
- กำหนดค่าว่าจะดำเนินการอย่างไรต่อไปหากผู้ใช้ไม่ยินยอมที่จะลิงก์ ของคุณได้ เช่น ส่งข้อความรับทราบและเปลี่ยนเส้นทางไปยังฉาก ซึ่งมีฟังก์ชันที่ไม่ต้องลิงก์บัญชี
- คลิกบันทึก
- ในส่วนเงื่อนไข ให้คลิกหากเกิดข้อผิดพลาดของระบบหรือเครือข่าย
- กำหนดค่าว่าจะดำเนินการอย่างไรต่อหากไม่สามารถลิงก์บัญชี เสร็จสมบูรณ์เนื่องจากข้อผิดพลาดของระบบหรือเครือข่าย เช่น ส่งข้อความรับทราบและเปลี่ยนเส้นทางไปยังฉาก ซึ่งมีฟังก์ชันที่ไม่ต้องลิงก์บัญชี
- คลิกบันทึก
เข้าถึงข้อมูลโปรไฟล์ในแบ็กเอนด์ของคุณ
หลังจากผู้ใช้ให้สิทธิ์การทำงานของคุณในการเข้าถึงโปรไฟล์ Google ของตน คุณจะได้รับ โทเค็นรหัส Google ที่มีข้อมูลโปรไฟล์ Google ของผู้ใช้ในทุกๆ หน้า คำขอให้ดำเนินการของคุณ
หากต้องการเข้าถึงข้อมูลโปรไฟล์ของผู้ใช้ คุณจะต้องตรวจสอบและถอดรหัสโทเค็นก่อน โดยทำดังนี้
- ใช้ไลบรารีการถอดรหัส JWT สำหรับภาษาของคุณเพื่อถอดรหัส โทเค็น และใช้คีย์สาธารณะของ Google (พร้อมใช้งานใน JWK หรือรูปแบบ PEM) เพื่อยืนยันลายเซ็นของโทเค็น
- ยืนยันว่าผู้ออกโทเค็น (ช่อง
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!'); });