تنفيذ خادم OAuth 2.0

يجب أن يتضمّن كل تكامل مع Cloud-to-cloud آلية لمصادقة المستخدمين.

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

توضّح هذه الصفحة كيفية إعداد خادم OAuth 2.0 لكي يعمل مع عملية الدمج في Cloud-to-cloud.

ربط حساب Google باستخدام OAuth

في مسار رمز التفويض، تحتاج إلى نقطتَي نهاية:

  • نقطة نهاية التفويض التي تعرض واجهة مستخدم تسجيل الدخول للمستخدمين الذين لم يسجّلوا الدخول بعد تنشئ نقطة نهاية التفويض أيضًا رمز تفويض قصير الأمد لتسجيل موافقة المستخدمين على الوصول المطلوب.

  • نقطة نهاية تبادل الرموز المميزة، وهي مسؤولة عن نوعَين من عمليات التبادل:

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

إرشادات التصميم

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

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

المتطلبات

  1. يجب توضيح أنّه سيتم ربط حساب المستخدم بحساب على Google، وليس بمنتج معيّن من منتجات Google، مثل Google Home أو "مساعد Google".
  2. يجب أن يتضمّن التطبيق بيان تفويض من Google، مثل "من خلال تسجيل الدخول، أنت تمنح Google الإذن بالتحكّم في أجهزتك". يُرجى الاطّلاع على قسم تفويض التحكّم في أجهزة Google ضمن سياسات المطوّرين في Google Home.
  3. يجب فتح صفحة ربط Web OAuth والتأكّد من توفّر طريقة واضحة للمستخدمين لتسجيل الدخول إلى حساب Google، مثل حقول اسم المستخدم وكلمة المرور. لا تستخدِم طريقة "تسجيل الدخول باستخدام حساب Google" (GSI) التي تتيح للمستخدمين الربط بدون الانتقال إلى صفحة ربط حسابات OAuth على الويب. ويشكّل ذلك انتهاكًا لسياسة Google.
  4. يجب تضمين عنصر واحد على الأقل من العناصر التالية في صفحة ربط حساب OAuth للإشارة إلى عملية الدمج التي يربط المستخدم حسابه بها:
    • شعار الشركة
    • اسم الشركة
    • اسم عملية الدمج
    • رمز التطبيق

الاقتراحات

ننصحك باتّخاذ الإجراءات التالية:

  1. عرض سياسة خصوصية Google تضمين رابط يؤدي إلى سياسة خصوصية Google في شاشة طلب الموافقة

  2. البيانات التي ستتم مشاركتها استخدِم لغة واضحة وموجزة لإخبار المستخدمين بالبيانات التي تطلبها Google منهم والغرض من ذلك، وببيانات الاستخدام أو التفاعل التي قد تشاركها Google معك.

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

  4. إمكانية الإلغاء: توفير طريقة للمستخدمين للرجوع أو الإلغاء إذا اختاروا عدم الربط

  5. عملية تسجيل دخول واضحة: تأكَّد من توفير طريقة واضحة للمستخدمين لتسجيل الدخول إلى حساباتهم على Google، مثل حقول اسم المستخدم وكلمة المرور أو تسجيل الدخول باستخدام حساب Google.

  6. إمكانية إلغاء الربط: توفير آلية للمستخدمين لإلغاء الربط، مثل عنوان URL يؤدي إلى إعدادات حساباتهم على منصتك بدلاً من ذلك، يمكنك تضمين رابط يؤدي إلى حساب Google حيث يمكن للمستخدمين إدارة حساباتهم المرتبطة. إذا ألغى المستخدم ربط حسابه بعملية الدمج، استخدِم agentUsers.delete لإبلاغ Google بالتغيير.

  7. إمكانية تغيير حساب المستخدم اقترِح طريقة تتيح للمستخدمين التبديل بين حساباتهم. ويكون ذلك مفيدًا بشكل خاص إذا كان المستخدمون يميلون إلى امتلاك حسابات متعدّدة.

    • إذا كان على المستخدم إغلاق شاشة طلب الموافقة للتبديل بين الحسابات، أرسِل خطأ قابلاً للاسترداد إلى Google ليتمكّن المستخدم من تسجيل الدخول إلى الحساب المطلوب باستخدام ربط الحسابات عبر OAuth.
  8. تضمين شعارك: عرض شعار شركتك على شاشة طلب الموافقة استخدِم إرشادات الأسلوب لتحديد موضع شعارك. إذا كنت تريد عرض شعار Google أيضًا، يُرجى الاطّلاع على الشعارات والعلامات التجارية.

مسار رمز التفويض

يتكوّن تنفيذ خادم OAuth 2.0 لمسار رمز التفويض من نقطتَي نهاية توفّرهما خدمتك من خلال بروتوكول HTTPS. نقطة النهاية الأولى هي نقطة نهاية التفويض، وهي المسؤولة عن العثور على موافقة المستخدمين أو الحصول عليها للوصول إلى البيانات. تعرض نقطة نهاية التفويض واجهة مستخدم لتسجيل الدخول للمستخدمين الذين لم يسجّلوا الدخول بعد، وتسجّل موافقتهم على الوصول المطلوب. نقطة النهاية الثانية هي نقطة نهاية تبادل الرموز المميّزة، والتي تُستخدم للحصول على سلاسل مشفّرة، تُسمى الرموز المميّزة، والتي تسمح للمستخدم بالوصول إلى خدمتك.

عندما يحتاج تطبيق Google إلى طلب إحدى واجهات برمجة التطبيقات الخاصة بخدمتك، تستخدم Google نقاط النهاية هذه معًا للحصول على إذن من المستخدمين لطلب واجهات برمجة التطبيقات هذه نيابةً عنهم.

يتّبع مسار رمز التفويض OAuth 2.0 الذي تبدأه Google الخطوات التالية:

  1. يفتح Google نقطة نهاية التفويض في متصفّح المستخدم. إذا بدأ الإجراء على جهاز صوتي فقط، تنقل Google عملية التنفيذ إلى هاتف.
  2. يسجّل المستخدم الدخول، إذا لم يكن قد سجّل الدخول من قبل، ويمنح Google الإذن بالوصول إلى بياناته باستخدام واجهة برمجة التطبيقات، إذا لم يسبق له منح الإذن.
  3. تنشئ الخدمة رمز تفويض وتعيده إلى Google. ولإجراء ذلك، عليك إعادة توجيه متصفّح المستخدم إلى Google مع إرفاق رمز التفويض بالطلب.
  4. ترسل Google رمز التفويض إلى نقطة نهاية تبادل الرموز المميزة، والتي تتحقق من صحة الرمز وتعرض رمز الدخول والرمز المميز لإعادة التحميل. رمز الدخول هو رمز مميّز قصير الأجل تقبله خدمتك كبيانات اعتماد للوصول إلى واجهات برمجة التطبيقات. الرمز المميز لإعادة التحميل هو رمز مميز طويل الأجل يمكن لـ Google تخزينه واستخدامه للحصول على رموز الدخول الجديدة عند انتهاء صلاحيتها.
  5. بعد أن يكمل المستخدم عملية ربط الحساب، سيتضمّن كل طلب لاحق ترسله Google رمز دخول.

التعامل مع طلبات التفويض

عندما تحتاج إلى ربط الحساب باستخدام مسار رمز التفويض OAuth 2.0، ترسل Google المستخدم إلى نقطة نهاية التفويض مع طلب يتضمّن المَعلمات التالية:

مَعلمات نقطة نهاية التفويض
client_id معرِّف العميل الذي عيّنته لـ Google.
redirect_uri عنوان URL الذي ترسل إليه الردّ على هذا الطلب.
state قيمة محاسبية يتم إرسالها مرة أخرى إلى Google بدون تغيير في معرّف الموارد المنتظم (URI) الخاص بإعادة التوجيه.
scope اختياري: مجموعة من سلاسل النطاقات مفصولة بمسافات تحدّد البيانات التي تطلب Google الحصول على إذن بالوصول إليها.
response_type نوع القيمة المطلوب عرضها في الردّ بالنسبة إلى مسار رمز التفويض في بروتوكول OAuth 2.0، يكون نوع الاستجابة دائمًا code.

على سبيل المثال، إذا كانت نقطة نهاية التفويض متاحة على https://myservice.example.com/auth، قد يبدو الطلب على النحو التالي:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&scope=REQUESTED_SCOPES&response_type=code

لكي تتمكّن نقطة نهاية التفويض من معالجة طلبات تسجيل الدخول، اتّبِع الخطوات التالية:

  1. تأكَّد من أنّ client_id يتطابق مع معرّف العميل الذي عيّنته لـ Google، ومن أنّ redirect_uri يتطابق مع عنوان URL لإعادة التوجيه الذي قدّمته Google لخدمتك. هذه الفحوصات مهمة لمنع منح إذن الوصول إلى تطبيقات العملاء غير المقصودة أو التي تم ضبطها بشكل خاطئ. إذا كانت عملياتك تتيح استخدام عدة مسارات لبروتوكول OAuth 2.0، يُرجى أيضًا التأكّد من أنّ response_type هو code.
  2. تحقَّق مما إذا كان المستخدم قد سجّل الدخول إلى خدمتك. إذا لم يسجّل المستخدم الدخول، أكمِل عملية تسجيل الدخول أو الاشتراك في الخدمة.
  3. أنشِئ رمز تفويض لتستخدمه Google للوصول إلى واجهة برمجة التطبيقات. يمكن أن يكون رمز التفويض أي قيمة سلسلة، ولكن يجب أن يمثّل بشكل فريد المستخدم والعميل الذي تم إنشاء الرمز المميّز له ووقت انتهاء صلاحية الرمز، ويجب ألا يكون قابلاً للتخمين. عادةً ما تصدر رموز تفويض تنتهي صلاحيتها بعد 10 دقائق تقريبًا.
  4. تأكَّد من أنّ عنوان URL المحدّد في المَعلمة redirect_uri يتّخذ الشكل التالي:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PROJECT_ID
      
  5. أعِد توجيه متصفّح المستخدم إلى عنوان URL المحدّد في المَعلمة redirect_uri. يجب تضمين رمز التفويض الذي أنشأته للتو وقيمة الحالة الأصلية غير المعدَّلة عند إعادة التوجيه من خلال إلحاق المَعلمتَين code وstate. في ما يلي مثال على عنوان URL الناتج:
    https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID?code=AUTHORIZATION_CODE&state=STATE_STRING

التعامل مع طلبات تبادل الرموز المميّزة

تكون نقطة نهاية تبادل الرموز المميّزة في الخدمة مسؤولة عن نوعَين من عمليات تبادل الرموز المميّزة:

  • استبدال رموز التفويض برموز الدخول والرموز المميزة لإعادة التحميل
  • استبدال الرموز المميزة لإعادة التحميل برموز الدخول

تتضمّن طلبات تبادل الرموز المميّزة المَعلمات التالية:

مَعلمات نقطة نهاية تبادل الرموز المميّزة
client_id سلسلة تحدّد مصدر الطلب على أنّه Google. يجب تسجيل هذه السلسلة في نظامك كمعرّف فريد لـ Google.
client_secret هي سلسلة سرية سجّلتها في Google لخدمتك.
grant_type نوع الرمز المميّز الذي يتم تبادله ويجب استخدام إما authorization_code أو refresh_token.
code عندما تكون قيمة المَعلمة grant_type=authorization_code، تكون هذه المَعلمة هي الرمز الذي تلقّته Google من نقطة نهاية تسجيل الدخول أو نقطة نهاية تبادل الرموز المميّزة.
redirect_uri عندما تكون قيمة المَعلمة grant_type=authorization_code، تكون هذه المَعلمة هي عنوان URL المستخدَم في طلب التفويض الأولي.
refresh_token عندما تكون قيمة المَعلمة grant_type=refresh_token، تكون هذه المَعلمة هي الرمز المميز لإعادة التحميل الذي تلقّته Google من نقطة نهاية تبادل الرموز المميزة.

ضبط كيفية إرسال Google لبيانات الاعتماد إلى خادمك

بناءً على طريقة التنفيذ، يتوقّع خادم التفويض تلقّي بيانات اعتماد العميل إما في نص الطلب أو في عنوان الطلب.

وفقًا للإعدادات التلقائية، ترسل Google بيانات الاعتماد في نص الطلب. إذا كان خادم التفويض يتطلّب تضمين بيانات اعتماد العميل في عنوان الطلب، عليك ضبط عملية دمج "Cloud-to-cloud" وفقًا لذلك:

الانتقال إلى Developer Console

  1. من قائمة المشاريع، انقر على فتح بجانب المشروع الذي تريد العمل عليه.

  2. ضمن من السحابة الإلكترونية إلى السحابة الإلكترونية، اختَر تطوير.

  3. انقر على فتح بجانب عملية الدمج.

  4. انتقِل للأسفل إلى قسم الأذونات (اختياري) وضَع علامة في مربّع الاختيار السماح لـ Google بنقل معرّف العميل وسرّه عبر عنوان المصادقة الأساسية لبروتوكول HTTP.

  5. انقر على حفظ لحفظ التغييرات.

استبدال رموز التفويض برموز الدخول والرموز المميزة لإعادة التحميل

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

بالنسبة إلى هذه الطلبات، تكون قيمة grant_type هي authorization_code، وقيمة code هي قيمة رمز التفويض الذي منحته سابقًا إلى Google. في ما يلي مثال على طلب تبديل رمز التفويض برمز مميز للدخول ورمز مميز لإعادة التحميل:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI

لتبديل رموز التفويض برمز دخول ورمز مميز لإعادة التحميل، تستجيب نقطة نهاية تبديل الرموز المميزة لطلبات POST من خلال تنفيذ الخطوات التالية:

  1. تأكَّد من أنّ client_id يحدّد مصدر الطلب على أنّه مصدر معتمَد، ومن أنّ client_secret يتطابق مع القيمة المتوقّعة.
  2. يُرجى التأكّد من أنّ رمز التفويض صالح وغير منتهي الصلاحية، ومن أنّ معرِّف العميل المحدّد في الطلب يتطابق مع معرِّف العميل المرتبط برمز التفويض.
  3. يُرجى التأكّد من أنّ عنوان URL المحدّد في المَعلمة redirect_uri مطابق للقيمة المستخدَمة في طلب التفويض الأولي.
  4. إذا لم تتمكّن من التحقّق من جميع المعايير المذكورة أعلاه، يمكنك عرض خطأ HTTP 400 Bad Request مع {"error": "invalid_grant"} كنص.
  5. وإلا، استخدِم رقم تعريف المستخدم من رمز التفويض لإنشاء رمز مميّز لإعادة التحميل ورمز مميّز للوصول. يمكن أن تكون هذه الرموز المميّزة أي قيمة سلسلة، ولكن يجب أن تمثّل بشكل فريد المستخدم والعميل الذي تم إنشاء الرمز المميّز له، ويجب ألا تكون قابلة للتخمين. بالنسبة إلى رموز الدخول، سجِّل أيضًا وقت انتهاء صلاحية الرمز، والذي يكون عادةً بعد ساعة من إصدار الرمز. لا تنتهي صلاحية الرموز المميّزة لإعادة التحميل.
  6. يجب عرض عنصر JSON التالي في نص استجابة HTTPS:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "refresh_token": "REFRESH_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }

تخزّن Google الرمز المميز للوصول والرمز المميز لإعادة التحميل للمستخدم وتسجّل انتهاء صلاحية الرمز المميز للوصول. عند انتهاء صلاحية رمز الدخول، تستخدم Google الرمز المميز لإعادة التحميل للحصول على رمز دخول جديد من نقطة نهاية تبادل الرموز المميزة.

استبدال الرموز المميزة لإعادة التحميل برموز الدخول

عند انتهاء صلاحية رمز الدخول، ترسل Google طلبًا إلى نقطة نهاية تبادل الرموز المميزة لاستبدال رمز مميز لإعادة التحميل برمز دخول جديد.

بالنسبة إلى هذه الطلبات، تكون قيمة grant_type هي refresh_token، وقيمة refresh_token هي قيمة الرمز المميز لإعادة التحميل الذي منحته سابقًا إلى Google. في ما يلي مثال على طلب استبدال رمز مميز لإعادة التحميل برمز دخول:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

client_id=GOOGLE_CLIENT_ID&client_secret=GOOGLE_CLIENT_SECRET&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

لاستبدال رمز مميّز لإعادة التحميل برمز مميّز للوصول، تستجيب نقطة نهاية تبادل الرموز المميّزة لطلبات POST من خلال تنفيذ الخطوات التالية:

  1. تأكَّد من أنّ client_id يحدّد مصدر الطلب على أنّه Google، ومن أنّ client_secret يتطابق مع القيمة المتوقّعة.
  2. يُرجى التحقّق من صلاحية الرمز المميّز لإعادة التحميل، ومن أنّ معرّف العميل المحدّد في الطلب يتطابق مع معرّف العميل المرتبط بالرمز المميّز لإعادة التحميل.
  3. إذا لم تتمكّن من التحقّق من جميع المعايير المذكورة أعلاه، يمكنك عرض رمز الخطأ HTTP 400 Bad Request مع {"error": "invalid_grant"} كنص.
  4. وإلا، يمكنك استخدام رقم تعريف المستخدم من الرمز المميز لإعادة التحميل لإنشاء رمز مميز للوصول. يمكن أن تكون هذه الرموز المميزة أي قيمة سلسلة، ولكن يجب أن تمثل بشكل فريد المستخدم والعميل الذي يمثله الرمز المميز، ويجب ألا تكون قابلة للتخمين. بالنسبة إلى رموز الدخول، سجِّل أيضًا وقت انتهاء صلاحية الرمز، والذي يكون عادةً بعد ساعة من إصدار الرمز.
  5. يجب عرض عنصر JSON التالي في نص استجابة HTTPS:
    {
    "token_type": "Bearer",
    "access_token": "ACCESS_TOKEN",
    "expires_in": SECONDS_TO_EXPIRATION
    }

التعامل مع طلبات معلومات المستخدم

نقطة نهاية userinfo هي مورد OAuth 2.0 محمي يعرض مطالبات بشأن المستخدم المرتبط. يُعد تنفيذ نقطة نهاية userinfo واستضافتها اختياريًا، باستثناء حالات الاستخدام التالية:

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

عناوين طلبات نقطة نهاية userinfo
Authorization header رمز الدخول من النوع "الحامل".

على سبيل المثال، إذا كانت نقطة نهاية userinfo متاحة على https://myservice.example.com/userinfo، قد يظهر الطلب على النحو التالي:

GET /userinfo HTTP/1.1
Host: myservice.example.com
Authorization: Bearer ACCESS_TOKEN

لتتمكّن نقطة نهاية معلومات المستخدم من معالجة الطلبات، عليك اتّباع الخطوات التالية:

  1. يمكنك استخراج رمز الدخول من عنوان التفويض ومعلومات الإرجاع للمستخدم المرتبط برمز الدخول.
  2. إذا كان رمز الدخول غير صالح، يمكنك عرض الخطأ HTTP 401 "غير مصرح به" مع استخدام عنوان الاستجابة WWW-Authenticate. في ما يلي مثال على استجابة خطأ في معلومات المستخدم:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    إذا تم عرض رسالة الخطأ 401 "غير مصرّح به" أو أي استجابة أخرى غير ناجحة للخطأ أثناء عملية الربط، لن تتمكّن من استرداد الخطأ، وسيتم تجاهل الرمز المميّز الذي تم استرداده وسيضطر المستخدم إلى بدء عملية الربط مرة أخرى.
  3. إذا كان رمز الدخول صالحًا، يتم عرض الاستجابة HTTP 200 مع كائن JSON التالي في نص HTTPS. الرد:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    إذا عرضت نقطة نهاية معلومات المستخدم استجابة نجاح HTTP 200، يتم تسجيل الرمز المميز الذي تم استرداده والمطالبات مقابل حساب المستخدم على Google.

    استجابة نقطة نهاية لمعلومات المستخدم
    sub معرّف فريد يعرّف المستخدِم في نظامك.
    email عنوان البريد الإلكتروني للمستخدم.
    given_name اختياري: الاسم الأول للمستخدم.
    family_name اختياري: اسم العائلة للمستخدم.
    name اختياري: اسم المستخدم الكامل.
    picture اختياري: صورة الملف الشخصي للمستخدم.