إنّ تسجيل الدخول باستخدام حساب Google في "مساعد Google" يوفّر تجربة المستخدم أبسط وأسهل. للمستخدمين والمطوّرين على حدّ سواء لربط الحسابات أو إنشائها. الإجراء الخاص بك طلب الوصول إلى الملف الشخصي للمستخدم في حساب Google أثناء محادثة، بما في ذلك اسم المستخدم وعنوان بريده الإلكتروني وصورة ملفه الشخصي
يمكن استخدام معلومات الملف الشخصي لتقديم تجربة مخصّصة للمستخدم. في الإجراء الخاص بك. إذا كانت لديك تطبيقات على أنظمة أساسية أخرى وتستخدم تسجيل الدخول بحساب Google، يمكنك أيضًا العثور على حساب مستخدم حالي وربطه، وإنشاء حساب جديد، وتنشئ قناة اتصال مباشرة للمستخدم.
لربط الحساب باستخدام ميزة "تسجيل الدخول باستخدام حساب Google"، يجب أن تطلب من المستخدم منح موافقته للوصول إلى ملفه الشخصي في Google. يمكنك بعد ذلك استخدام المعلومات الموجودة في ملفه الشخصي مثل عنوان بريده الإلكتروني، للتعرف على المستخدم في نظامك.
تنفيذ عملية ربط حساب "تسجيل الدخول بحساب Google"
يُرجى اتّباع الخطوات الواردة في الأقسام التالية لإضافة ربط حساب "تسجيل الدخول بحساب Google" إلى الحركة.
ضبط المشروع
لضبط مشروعك على استخدام ربط حساب "تسجيل الدخول بحساب Google"، اتّبِع الخطوات التالية:
- افتح "وحدة تحكّم المهام" واختَر مشروعًا.
- انقر على علامة التبويب تطوير واختَر ربط الحساب.
- فعِّل مفتاح التبديل بجانب ربط الحساب.
- في القسم إنشاء الحساب، اختَر نعم.
في نوع الربط، اختَر تسجيل الدخول بحساب Google.
افتح معلومات العميل ودوِّن قيمة رقم تعريف العميل الصادرة عن Google لإجراءاتك.
انقر على حفظ.
تصميم واجهة مستخدم صوتية لتدفق المصادقة
تحقَّق مما إذا تم التحقّق من هوية المستخدم وابدأ خطوات ربط الحساب.
- افتح مشروع "أداة إنشاء المهام" في وحدة تحكُّم المهام.
- أنشِئ مشهدًا جديدًا لبدء ربط الحساب في الإجراء الخاص بك:
- انقر على المَشاهد.
- انقر على الرمز إضافة (+) لإضافة مشهد جديد.
- في المشهد الذي تم إنشاؤه حديثًا، انقر على رمز الإضافة add. رمز الشروط.
- أضِف شرطًا يتحقّق مما إذا كان المستخدم المرتبط بالمحادثة
مستخدم معتمد. إذا تعذَّر التحقّق، لن يتمكّن الإجراء من ربط الحساب.
أثناء المحادثة، وينبغي أن يعود لتوفير الوصول إلى
بوظيفة لا تتطلب ربط الحسابات.
- في الحقل
Enter new expression
ضمن الشرط، أدخِل المنطق التالي:user.verificationStatus != "VERIFIED"
- ضمن نقل، اختَر مشهدًا لا يتطلّب ربط الحساب أو المشهد الذي يمثل نقطة دخول إلى وظيفة الضيوف فقط.
- في الحقل
- انقر على رمز إضافة add من أجل الشروط.
- إضافة شرط لبدء عملية ربط الحساب إذا لم يكن لدى المستخدم
بهوية مرتبطة.
- في الحقل
Enter new expression
ضمن الشرط، أدخِل المنطق التالي:user.verificationStatus == "VERIFIED"
- ضمن الانتقال، اختَر مشهد النظام ربط الحساب.
- انقر على حفظ.
- في الحقل
بعد الحفظ، تم إنشاء مشهد جديد لنظام ربط الحسابات يُسمى <SceneName>_AccountLinking
.
تمت إضافته إلى مشروعك.
تخصيص مشهد ربط الحسابات
- ضمن المَشاهد، اختَر مشهد نظام ربط الحسابات.
- انقر على إرسال طلب وأضِف جملة قصيرة تصفها للمستخدم. سبب احتياج الإجراء إلى الوصول إلى هويته (مثلاً، "حفظ إعداداتك المفضّلة").
- انقر على حفظ.
- ضمن الشروط، انقر على إذا أكمل المستخدم ربط الحساب بنجاح.
- يمكنك ضبط كيفية متابعة التدفق إذا وافق المستخدم على ربط حسابه. مثلاً، يمكنك طلب الردّ التلقائي على الويب لمعالجة أي منطق مخصّص للنشاط التجاري. والعودة إلى المشهد الأصلي.
- انقر على حفظ.
- ضمن الشروط، انقر على إذا ألغى المستخدم ربط الحساب أو رفضه.
- قم بتهيئة كيفية متابعة التدفق إذا لم يوافق المستخدم على ربط الحساب. على سبيل المثال، يمكنك إرسال رسالة إقرار وإعادة التوجيه إلى المشاهد. التي توفّر وظائف لا تتطلّب ربط الحسابات.
- انقر على حفظ.
- ضمن الشروط، انقر على في حال حدوث خطأ في النظام أو الشبكة.
- اضبط كيفية سير العملية إذا تعذّر إكمال عملية ربط الحساب اكتمل بسبب أخطاء في النظام أو الشبكة. على سبيل المثال، يمكنك إرسال رسالة إقرار وإعادة التوجيه إلى المشاهد. التي توفّر وظائف لا تتطلّب ربط الحسابات.
- انقر على حفظ.
الوصول إلى معلومات الملف الشخصي في الخلفية
بعد أن يفوّض المستخدم الإجراء للوصول إلى ملفه الشخصي على 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" }
إذا كنت تستخدم مكتبة تنفيذ الإجراءات على Google لنظام 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!'); });