ربط الحساب من خلال تسجيل الدخول بحساب Google

إنّ تسجيل الدخول باستخدام حساب Google في خدمة "مساعد Google" يوفّر للمستخدمين والمطوّرين أبسط وأسهل تجربة ممكنة، وذلك في ما يتعلّق بربط الحسابات وإنشاء الحسابات منها. يمكن أن يطلب الإجراء الخاص بك الوصول إلى الملف الشخصي للمستخدم على Google أثناء محادثة، بما في ذلك اسم المستخدم وعنوان بريده الإلكتروني وصورة ملفه الشخصي.

يمكن استخدام معلومات الملف الشخصي لإنشاء تجربة مستخدم مخصّصة في الإجراء الخاص بك. إذا كانت لديك تطبيقات على منصات أخرى وكانت تستخدم ميزة "تسجيل الدخول بحساب Google"، يمكنك أيضًا العثور على حساب مستخدم حالي والربط به، وإنشاء حساب جديد، وإنشاء قناة اتصال مباشرة للمستخدم.

لربط الحساب باستخدام ميزة "تسجيل الدخول بحساب Google"، عليك أن تطلب من المستخدم منح موافقته على الوصول إلى ملفه الشخصي على Google. ثم تستخدم المعلومات الموجودة في ملفه الشخصي، على سبيل المثال، عنوان بريده الإلكتروني، لتحديد المستخدم في نظامك.

تنفيذ ربط حساب تسجيل الدخول بحساب Google

اتّبِع الخطوات الواردة في الأقسام التالية لإضافة ربط حساب "تسجيل الدخول بحساب Google" إلى الإجراء الخاص بك.

ضبط المشروع

لإعداد مشروعك لاستخدام ربط حساب تسجيل الدخول بحساب Google، اتّبِع الخطوات التالية:

  1. افتح وحدة تحكّم المهام واختَر مشروعًا.
  2. انقر على علامة التبويب التطوير واختَر ربط الحساب.
  3. فعِّل مفتاح التبديل بجانب ربط الحساب.
  4. في القسم إنشاء الحساب، اختَر نعم.
  5. في نوع الربط، اختَر تسجيل الدخول بحساب Google.

  6. افتح معلومات العميل ودوِّن قيمة معرّف العميل الذي أصدرته Google للإجراءات.

  7. انقر على حفظ.

تصميم واجهة مستخدم صوتي لتدفق المصادقة

التحقّق ممّا إذا كان قد تم إثبات هوية المستخدم، ثم ابدأ عملية ربط الحساب

  1. افتح مشروع "أداة إنشاء الإجراءات" في وحدة تحكّم المهام.
  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. اضبط كيفية سير التدفق إذا وافق المستخدم على ربط حسابه. على سبيل المثال، يمكنك الاتصال بالرد التلقائي على الويب لمعالجة أي منطق مخصص للنشاط التجاري مطلوب والرجوع إلى المشهد الأصلي.
  3. انقر على حفظ.

  1. ضمن الشروط، انقر على في حال إلغاء المستخدم ربط الحساب أو رفضه.
  2. اضبط كيفية سير العملية إذا لم يوافق المستخدم على ربط حسابه. على سبيل المثال، أرسِل رسالة إقرار وإعادة التوجيه إلى المشاهد التي توفّر وظائف لا تتطلب ربط الحساب.
  3. انقر على حفظ.

  1. ضمن الشروط، انقر على في حال حدوث خطأ في النظام أو الشبكة.
  2. اضبط كيفية سير التدفق إذا تعذّر إكمال عملية ربط الحساب بسبب أخطاء في النظام أو الشبكة. على سبيل المثال، أرسِل رسالة إقرار وإعادة التوجيه إلى المشاهد التي توفّر وظائف لا تتطلب ربط الحساب.
  3. انقر على حفظ.

الوصول إلى معلومات الملف الشخصي في الخلفية

بعد أن يسمح المستخدم للإجراء بالوصول إلى ملفه الشخصي على Google، ستتلقّى رمزًا مميّزًا لمعرّف Google يتضمّن معلومات الملف الشخصي الخاص بالمستخدم على حساب Google في كل طلب لاحق منك.

للوصول إلى معلومات الملف الشخصي للمستخدم، تحتاج أولاً إلى التحقق من الرمز المميز وفك ترميزه من خلال تنفيذ ما يلي:

  1. استخدِم مكتبة لفك ترميز JWT بلغتك لفك ترميز الرمز المميّز، واستخدِم مفاتيح Google العامة (المتوفّرة بتنسيق JWK أو PEM) للتحقّق من توقيع الرمز المميّز.
  2. تأكَّد من أنّ جهة إصدار الرمز المميّز (الحقل 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 ID موجود من قبل في قاعدة البيانات. يُظهر مقتطف الرمز التالي مثالاً على كيفية التحقق مما إذا كانت طلبات مستخدم موجودة بالفعل في قاعدة بيانات 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!');
});