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

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

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

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

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

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

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

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

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

  6. פותחים את הקטע Client Information ורושמים את הערך של Client-ID ש-Google מנפיקה לפעולות שלכם.

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

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

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

  1. פותחים את הפרויקט Actions Builder ב-Actions Console.
  2. כדי להתחיל לקשר חשבונות בפעולה, צריך ליצור סצנה חדשה:
    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. מגדירים איך התהליך יימשך אם המשתמש מסכים לקשר את החשבון. לדוגמה, אפשר להפעיל את ה-webhook כדי לעבד כל לוגיקה עסקית מותאמת אישית שנדרשת ולחזור לסצנת המקור.
  3. לוחצים על שמירה.

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

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

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

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

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

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