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