קישור חשבון באמצעות כניסה באמצעות חשבון Google

כניסה באמצעות חשבון Google ל-Assistant מספקת את חוויית המשתמש הפשוטה והקלה ביותר למשתמשים ולמפתחים, גם לקישור חשבונות וגם ליצירת חשבונות. הפעולה יכולה לבקש גישה לפרופיל Google של המשתמש במהלך שיחה, כולל שם המשתמש, כתובת האימייל ותמונת הפרופיל שלו.

פרטי הפרופיל מאפשרים ליצור חוויית משתמש מותאמת אישית בפעולה. אם יש לכם אפליקציות בפלטפורמות אחרות והן משתמשות בכניסה באמצעות חשבון Google, תוכלו גם למצוא חשבון של משתמש קיים ולקשר אליו, ליצור חשבון חדש וליצור ערוץ תקשורת ישיר עם המשתמש.

כדי לקשר חשבון באמצעות כניסה באמצעות חשבון Google, צריך לבקש מהמשתמש להסכים לגישה לפרופיל שלו ב-Google. לאחר מכן, עליך להשתמש במידע מהפרופיל שלו, לדוגמה כתובת האימייל, כדי לזהות את המשתמש במערכת.

הטמעת קישור של חשבון כניסה באמצעות חשבון Google

כדי להוסיף לפעולה את הקישור של חשבון 'כניסה באמצעות חשבון Google', פועלים לפי השלבים המפורטים בקטעים הבאים.

הגדרת הפרויקט

כדי להגדיר בפרויקט שלכם להשתמש בקישור של חשבון כניסה באמצעות חשבון Google, יש לבצע את השלבים הבאים:

  1. פותחים את Actions Console ובוחרים פרויקט.
  2. לוחצים על הכרטיסייה פיתוח ובוחרים באפשרות קישור חשבונות.
  3. מפעילים את המתג שלצד קישור חשבונות.
  4. בקטע יצירת חשבון, בוחרים באפשרות כן.
  5. בקטע סוג הקישור, בוחרים באפשרות כניסה באמצעות חשבון Google.

  6. פותחים את פרטי הלקוח ורושמים את הערך של מזהה הלקוח ש-Google סיפקה לפעולות שלכם.

  7. לוחצים על שמירה.

עיצוב ממשק המשתמש הקולי לתהליך האימות

בודקים אם המשתמש מאומת ומתחילים בתהליך קישור החשבון

  1. פותחים את הפרויקט ב-Actions Builder ב-Actions Console.
  2. יוצרים סצנה חדשה כדי להתחיל את קישור החשבונות בפעולה:
    1. לוחצים על סצנות.
    2. לוחצים על הסמל הוספה (+) כדי להוסיף סצנה חדשה.
  3. בסצנה החדשה שנוצרה, לוחצים על סמל ההוספה של Conditions.
  4. אפשר להוסיף תנאי שבודק אם המשתמש שמשויך לשיחה הוא משתמש מאומת. אם הבדיקה נכשלת, הפעולה לא יכולה לבצע קישור חשבונות במהלך השיחה. במקום זאת, אתם אמורים לקבל גישה לפונקציונליות שלא מחייבת קישור חשבונות.
    1. בשדה Enter new expression בקטע תנאי, מזינים את הלוגיקה הבאה: user.verificationStatus != "VERIFIED"
    2. בקטע Transition, בוחרים סצנה שלא מחייבת קישור של חשבונות, או סצנה שהיא נקודת הכניסה לפונקציונליות לאורחים בלבד.

  1. לוחצים על סמל ההוספה עבור תנאים.
  2. אפשר להוסיף תנאי שמפעיל תהליך של קישור חשבון אם למשתמש לא משויכת זהות.
    1. בשדה Enter new expression בקטע תנאי, מזינים את הלוגיקה הבאה: user.verificationStatus == "VERIFIED"
    2. בקטע מעבר, בוחרים בסצנה של המערכת קישור חשבונות.
    3. לוחצים על שמירה.

אחרי השמירה, תתווסף לפרויקט סצנה חדשה של מערכת קישור חשבונות בשם <SceneName>_AccountLinking.

התאמה אישית של הסצנה של קישור החשבונות

  1. בקטע סצנות, בוחרים את סצנת המערכת לקישור החשבונות.
  2. לוחצים על שליחת בקשה ומוסיפים משפט קצר שיתאר למשתמש למה הפעולה צריכה לגשת לזהות שלו (לדוגמה, 'כדי לשמור את ההעדפות שלך').
  3. לוחצים על שמירה.

  1. בקטע תנאים, לוחצים על אם המשתמש השלים את קישור החשבון.
  2. יש להגדיר את המשך התהליך אם המשתמש מסכים לקשר את החשבון שלו. לדוגמה, אפשר לקרוא ל-webhook כדי לעבד כל לוגיקה עסקית מותאמת אישית שנדרשת ולחזור לסצנת המקור.
  3. לוחצים על שמירה.

  1. בקטע תנאים, לוחצים על אם המשתמש מבטל או סוגר קישור חשבונות.
  2. מגדירים את הפעולות שהמשתמשים צריכים לבצע אם הם לא מסכימים לקשר את החשבון. לדוגמה, שלחו הודעה תודה והפנו את המשתמשים לסצנות עם פונקציונליות שלא מחייבת קישור חשבונות.
  3. לוחצים על שמירה.

  1. בקטע תנאים, לוחצים על אם מתרחשת שגיאת מערכת או רשת.
  2. אתם יכולים להגדיר איך להמשיך בתהליך אם לא ניתן להשלים את תהליך קישור החשבונות בגלל שגיאות מערכת או רשת. לדוגמה, שלחו הודעה תודה והפנו את המשתמשים לסצנות עם פונקציונליות שלא מחייבת קישור חשבונות.
  3. לוחצים על שמירה.

גישה לפרטי הפרופיל בקצה העורפי

אחרי שהמשתמש יאשר את הגישה שלכם לפרופיל Google, תקבלו אסימון מזהה של Google שכולל את פרטי פרופיל Google של המשתמש בכל בקשה נוספת לביצוע.

כדי לגשת לפרטי הפרופיל של המשתמש, צריך קודם לאמת ולפענח את האסימון באמצעות הפעולות הבאות:

  1. כדי לפענח את האסימון בשפה שלכם, השתמשו בספריית JWT לפענוח, ובעזרת המפתחות הציבוריים של Google (שזמינים בפורמט JWK או PEM) כדי לאמת את החתימה של האסימון.
  2. צריך לוודא שמנפיק האסימון (השדה iss באסימון המפוענח) הוא https://accounts.google.com, ושהקהל (השדה aud באסימון המפוענח) הוא הערך של Client-ID ש-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"
}

אם אתם משתמשים בספריית פעולות ב-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!');
});