پیوند دادن حساب با Google Sign-In

Google Sign-In for the Assistant ساده ترین و آسان ترین تجربه کاربری را برای کاربران و توسعه دهندگان برای پیوند دادن حساب و ایجاد حساب فراهم می کند. Action شما می‌تواند درخواست دسترسی به نمایه Google کاربر شما را در طول مکالمه کند، از جمله نام کاربر، آدرس ایمیل، و تصویر نمایه.

از اطلاعات نمایه می توان برای ایجاد یک تجربه کاربری شخصی شده در Action خود استفاده کرد. اگر برنامه‌هایی در پلتفرم‌های دیگر دارید و از Google Sign-In استفاده می‌کنند، می‌توانید حساب کاربری موجود را پیدا کرده و به آن پیوند دهید، یک حساب جدید ایجاد کنید و یک کانال ارتباطی مستقیم با کاربر ایجاد کنید.

برای انجام پیوند دادن حساب با Google Sign-In، از کاربر می‌خواهید که رضایت خود را برای دسترسی به نمایه Google خود اعلام کند. سپس از اطلاعات نمایه آنها، به عنوان مثال آدرس ایمیل آنها، برای شناسایی کاربر در سیستم خود استفاده می کنید.

پیوند حساب Google Sign-In را پیاده سازی کنید

برای افزودن پیوند حساب Google Sign-In به Action خود، مراحل زیر را دنبال کنید.

پروژه را پیکربندی کنید

برای پیکربندی پروژه خود برای استفاده از پیوند حساب Google Sign-In، این مراحل را دنبال کنید:

  1. Actions Console را باز کنید و یک پروژه را انتخاب کنید.
  2. روی تب Develop کلیک کنید و Account linking را انتخاب کنید.
  3. سوئیچ کنار Account linking را فعال کنید.
  4. در بخش ایجاد حساب ، بله را انتخاب کنید.
  5. در نوع پیوند ، Google Sign In را انتخاب کنید.

  6. اطلاعات مشتری را باز کنید و به ارزش شناسه مشتری صادر شده توسط Google برای Actions خود توجه داشته باشید.

  7. روی ذخیره کلیک کنید.

رابط کاربری صوتی را برای جریان احراز هویت طراحی کنید

بررسی کنید که آیا کاربر تأیید شده است و جریان پیوند حساب را شروع کنید

  1. پروژه Actions Builder خود را در Actions Console باز کنید.
  2. یک صحنه جدید برای شروع پیوند دادن حساب در Action خود ایجاد کنید:
    1. روی صحنه ها کلیک کنید.
    2. برای افزودن یک صحنه جدید، روی نماد افزودن (+) کلیک کنید.
  3. در صحنه جدید ایجاد شده، روی نماد افزودن برای Conditions کلیک کنید.
  4. شرطی اضافه کنید که بررسی کند آیا کاربر مرتبط با مکالمه یک کاربر تأیید شده است یا خیر. اگر بررسی ناموفق باشد، Action شما نمی‌تواند پیوند حساب را در طول مکالمه انجام دهد و باید به ارائه دسترسی به عملکردی که نیازی به پیوند حساب ندارد بازگردد.
    1. در قسمت Enter new expression در Condition ، منطق زیر را وارد کنید: user.verificationStatus != "VERIFIED"
    2. در بخش انتقال ، صحنه‌ای را انتخاب کنید که نیازی به پیوند دادن حساب ندارد یا صحنه‌ای که نقطه ورود به عملکرد فقط مهمان است.

  1. روی نماد افزودن برای شرایط کلیک کنید.
  2. در صورتی که کاربر هویت مرتبطی نداشته باشد، شرطی را برای فعال کردن جریان پیوند حساب اضافه کنید.
    1. در قسمت Enter new expression در Condition ، منطق زیر را وارد کنید: user.verificationStatus == "VERIFIED"
    2. در بخش Transition ، صحنه سیستم پیوند حساب را انتخاب کنید.
    3. روی ذخیره کلیک کنید.

پس از ذخیره، یک صحنه سیستم پیوند حساب جدید به نام <SceneName>_AccountLinking به پروژه شما اضافه می شود.

صحنه پیوند حساب را سفارشی کنید

  1. در بخش صحنه‌ها ، صحنه سیستم پیوند دهنده حساب را انتخاب کنید.
  2. روی Send prompt کلیک کنید و یک جمله کوتاه اضافه کنید تا به کاربر توضیح دهد که چرا Action باید به هویت او دسترسی داشته باشد (به عنوان مثال "برای ذخیره تنظیمات برگزیده").
  3. روی ذخیره کلیک کنید.

  1. در زیر شرایط ، روی اگر کاربر با موفقیت پیوند حساب را انجام دهد کلیک کنید.
  2. اگر کاربر موافقت کرد که حساب خود را پیوند دهد، نحوه جریان را پیکربندی کنید. به عنوان مثال، برای پردازش هرگونه منطق تجاری سفارشی مورد نیاز و انتقال به صحنه اصلی، با webhook تماس بگیرید.
  3. روی ذخیره کلیک کنید.

  1. در زیر شرایط ، روی اگر کاربر پیوند دادن حساب را لغو یا رد کرد، کلیک کنید.
  2. اگر کاربر با پیوند دادن حساب خود موافقت نکرد، نحوه جریان را پیکربندی کنید. به عنوان مثال، یک پیام تأیید ارسال کنید و به صحنه‌هایی هدایت کنید که عملکردی را ارائه می‌کنند که نیازی به پیوند دادن حساب ندارد.
  3. روی ذخیره کلیک کنید.

  1. در قسمت Conditions ، روی If system or network error رخ می دهد کلیک کنید.
  2. اگر به دلیل خطاهای سیستم یا شبکه نمی‌توان جریان پیوند حساب را تکمیل کرد، نحوه انجام جریان را پیکربندی کنید. به عنوان مثال، یک پیام تأیید ارسال کنید و به صحنه‌هایی هدایت کنید که عملکردی را ارائه می‌کنند که نیازی به پیوند دادن حساب ندارد.
  3. روی ذخیره کلیک کنید.

به اطلاعات نمایه در باطن خود دسترسی داشته باشید

پس از اینکه کاربر اقدام شما را برای دسترسی به نمایه Google خود مجاز کرد، یک نشانه Google ID دریافت خواهید کرد که حاوی اطلاعات نمایه 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"
}

اگر از کتابخانه 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!');
});