يوضّح هذا المستند كيفية تنفيذ تفويض OAuth 2.0 للوصول إلى YouTube Data API من تطبيق ويب يستند إلى JavaScript. يتيح بروتوكول OAuth 2.0 للمستخدمين مشاركة بيانات محدَّدة مع أحد التطبيقات والحفاظ على خصوصية أسماء المستخدمين وكلمات المرور والمعلومات الأخرى. على سبيل المثال، يمكن لتطبيق استخدام OAuth 2.0 للحصول على إذن بتحميل فيديوهات إلى قناة مستخدم على YouTube.
يُطلق على مسار OAuth 2.0 هذا اسم مسار الإذن الضمني. وهي مصمَّمة للتطبيقات التي لا يمكنها الوصول إلى واجهات برمجة التطبيقات إلا عندما يكون المستخدم متواجدًا في التطبيق. ولا يمكن لهذه التطبيقات تخزين معلومات سرية.
في هذا المسار، يفتح تطبيقك عنوان URL تابعًا لـ Google يستخدم معلَمات طلب بحث لتحديد تطبيقك ونوع الوصول إلى واجهة برمجة التطبيقات الذي يحتاج إليه التطبيق. يمكنك فتح عنوان URL في نافذة المتصفّح الحالية أو في نافذة منبثقة. يمكن للمستخدم المصادقة باستخدام Google ومنح الأذونات المطلوبة. بعد ذلك، تعيد Google توجيه المستخدم إلى تطبيقك، ويتضمّن التوجيه رمز دخول يتحقّق منه تطبيقك ثم يستخدمه لإرسال طلبات إلى واجهة برمجة التطبيقات.
مكتبة برامج Google APIs وخدمات Google Identity
إذا كنت تستخدم مكتبة برامج Google APIs لعميل JavaScript لإجراء طلبات معتمَدة إلى Google، عليك استخدام مكتبة JavaScript الخاصة بخدمات Google Identity للتعامل مع مسار OAuth 2.0. يُرجى الاطّلاع على نموذج الرمز المميز الخاص بخدمات هوية Google، والذي يستند إلى مسار منح الإذن الضمني في بروتوكول OAuth 2.0.
المتطلبات الأساسية
تفعيل واجهات برمجة التطبيقات لمشروعك
يجب تفعيل واجهات Google APIs في API Consoleلأي تطبيق يستدعي هذه الواجهات.
لتفعيل واجهة برمجة تطبيقات لمشروعك، اتّبِع الخطوات التالية:
- Open the API Library في Google API Console
- If prompted, select a project, or create a new one.
- استخدِم صفحة المكتبة للعثور على YouTube Data API وتفعيلها. ابحث عن أي واجهات برمجة تطبيقات أخرى سيستخدمها تطبيقك وفعِّلها أيضًا.
إنشاء بيانات اعتماد التفويض
يجب أن يتضمّن أي تطبيق يستخدم OAuth 2.0 للوصول إلى Google APIs بيانات اعتماد تفويض تحدّد التطبيق لخادم OAuth 2.0 من Google. توضّح الخطوات التالية كيفية إنشاء بيانات اعتماد لمشروعك. يمكن لتطبيقاتك بعد ذلك استخدام بيانات الاعتماد للوصول إلى واجهات برمجة التطبيقات التي فعّلتها لهذا المشروع.
- Go to the Credentials page.
- انقر على إنشاء عميل.
- اختَر نوع التطبيق تطبيق الويب.
- أكمل النموذج. يجب أن تحدّد التطبيقات التي تستخدم JavaScript لإرسال طلبات معتمَدة إلى Google API مصادر JavaScript معتمَدة. تحدّد المصادر النطاقات التي يمكن لتطبيقك إرسال طلبات منها إلى خادم OAuth 2.0. يجب أن تلتزم هذه المصادر بقواعد التحقّق من الصحة في Google.
تحديد نطاقات الوصول
تتيح النطاقات لتطبيقك طلب الوصول إلى الموارد التي يحتاجها فقط، كما تتيح للمستخدمين التحكّم في مقدار الوصول الذي يمنحونه لتطبيقك. وبالتالي، قد تكون هناك علاقة عكسية بين عدد النطاقات المطلوبة واحتمالية الحصول على موافقة المستخدم.
قبل البدء في تنفيذ تفويض OAuth 2.0، ننصحك بتحديد النطاقات التي سيحتاج تطبيقك إلى إذن للوصول إليها.
يستخدم الإصدار 3 من YouTube Data API النطاقات التالية:
النطاق | الوصف |
---|---|
https://www. |
إدارة حسابك في YouTube |
https://www. |
الاطّلاع على قائمة بأعضاء القناة النشطين حاليًا ومستواهم الحالي وتاريخ انضمامهم |
https://www. |
الاطّلاع على فيديوهاتك على YouTube وتقييماتها وتعليقاتها وترجماتها وكذلك تعديلها وحذفها نهائيًا |
https://www. |
عرض حسابك في YouTube |
https://www. |
إدارة فيديوهات YouTube |
https://www. |
عرض وإدارة أصولك والمحتوى المرتبط بها على YouTube |
https://www. |
عرض معلومات خاصة عن قناتك على YouTube ذات صلة أثناء عملية تدقيق شريك YouTube |
يحتوي مستند نطاقات واجهة برمجة التطبيقات OAuth 2.0 على قائمة كاملة بالنطاقات التي يمكنك استخدامها للوصول إلى Google APIs.
الحصول على رموز الدخول عبر OAuth 2.0
توضّح الخطوات التالية كيفية تفاعل تطبيقك مع خادم OAuth 2.0 من Google للحصول على موافقة المستخدم على تنفيذ طلب API بالنيابة عنه. يجب أن يحصل تطبيقك على هذه الموافقة قبل أن يتمكّن من تنفيذ طلب Google API يتطلّب إذن المستخدم.
الخطوة 1: إعادة التوجيه إلى خادم OAuth 2.0 من Google
لطلب الإذن بالوصول إلى بيانات المستخدم، عليك إعادة توجيهه إلى خادم OAuth 2.0 من Google.
نقاط نهاية OAuth 2.0
أنشئ عنوان URL لطلب إذن الوصول من نقطة نهاية OAuth 2.0 في Google على https://accounts.google.com/o/oauth2/v2/auth
. يمكن الوصول إلى نقطة النهاية هذه عبر HTTPS،
ويتم رفض اتصالات HTTP العادية.
يتيح خادم التفويض من Google استخدام مَعلمات سلسلة طلب البحث التالية لتطبيقات خادم الويب:
المعلمات | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
client_id |
مطلوب
معرّف العميل لتطبيقك يمكنك العثور على هذه القيمة في . |
||||||||||||||||
redirect_uri |
مطلوب
تحدِّد هذه السمة المكان الذي يعيد خادم واجهة برمجة التطبيقات توجيه المستخدم إليه بعد إكماله عملية التفويض. يجب أن تتطابق القيمة تمامًا مع أحد معرّفات الموارد المنتظمة (URI) المسموح بها لإعادة التوجيه الخاصة بعميل OAuth 2.0 الذي أعددته في
الخاص بعميلك. إذا لم تتطابق هذه القيمة مع معرّف الموارد المنتظم (URI) المصرّح به لإعادة التوجيه والمقدَّم يُرجى العِلم أنّه يجب أن يتطابق كل من نظام |
||||||||||||||||
response_type |
مطلوب
يجب أن تحدّد تطبيقات JavaScript قيمة المَعلمة على |
||||||||||||||||
scope |
مطلوب
قائمة مفصولة بمسافات تتضمّن النطاقات التي تحدّد الموارد التي يمكن لتطبيقك الوصول إليها نيابةً عن المستخدم. تُعلم هذه القيم شاشة الموافقة التي تعرضها Google للمستخدم. تتيح النطاقات لتطبيقك طلب الوصول إلى الموارد التي يحتاج إليها فقط، كما تتيح للمستخدمين التحكّم في مقدار الوصول الذي يمنحونه لتطبيقك. وبالتالي، هناك علاقة عكسية بين عدد النطاقات المطلوبة واحتمالية الحصول على موافقة المستخدم. يستخدم الإصدار 3 من YouTube Data API النطاقات التالية:
يوفّر مستند نطاقات واجهة برمجة التطبيقات OAuth 2.0 قائمة كاملة بالنطاقات التي يمكنك استخدامها للوصول إلى Google APIs. ننصح بأن يطلب تطبيقك الوصول إلى نطاقات التفويض في السياق كلما أمكن ذلك. من خلال طلب الوصول إلى بيانات المستخدمين في سياق استخدام التطبيق، وذلك من خلال الترخيص المتزايد، يمكنك مساعدة المستخدمين على فهم سبب احتياج تطبيقك إلى إذن الوصول الذي يطلبه. |
||||||||||||||||
state |
مقترَح
تحدّد هذه السمة أي قيمة سلسلة تستخدمها التطبيقات للحفاظ على الحالة بين طلب التفويض والاستجابة من خادم التفويض.
يعرض الخادم القيمة نفسها التي ترسلها كزوج يمكنك استخدام هذه المَعلمة لعدّة أغراض، مثل توجيه المستخدم إلى المرجع الصحيح في تطبيقك، وإرسال أرقام عشوائية، والحدّ من التزوير في الطلبات الواردة من مواقع إلكترونية مختلفة. بما أنّه يمكن تخمين |
||||||||||||||||
include_granted_scopes |
اختياريّ
تتيح هذه السمة للتطبيقات استخدام المصادقة المتزايدة لطلب الوصول إلى نطاقات إضافية حسب السياق. إذا ضبطت قيمة هذه المَعلمة على |
||||||||||||||||
enable_granular_consent |
اختياريّ
القيمة التلقائية هي عندما تفعّل Google أذونات تفصيلية لأحد التطبيقات، لن يكون لهذه المَعلمة أي تأثير. |
||||||||||||||||
login_hint |
اختياريّ
إذا كان تطبيقك يعرف المستخدم الذي يحاول إثبات هويته، يمكنه استخدام هذه المَعلمة لتقديم تلميح إلى خادم مصادقة Google. يستخدم الخادم التلميح لتبسيط عملية تسجيل الدخول، إما عن طريق ملء حقل البريد الإلكتروني مسبقًا في نموذج تسجيل الدخول أو عن طريق اختيار جلسة تسجيل الدخول المتعدد المناسبة. اضبط قيمة المَعلمة على عنوان بريد إلكتروني أو معرّف |
||||||||||||||||
prompt |
اختياريّ
قائمة حساسة لحالة الأحرف ومفصولة بمسافات تتضمّن الطلبات التي سيتم عرضها للمستخدم في حال عدم تحديد هذه المَعلمة، سيُطلب من المستخدم الإذن بالوصول إلى البيانات في المرة الأولى فقط التي يطلب فيها مشروعك الوصول إليها. يمكنك الاطّلاع على طلب إعادة الموافقة لمزيد من المعلومات. القيم المحتملة هي:
|
مثال على إعادة التوجيه إلى خادم التفويض في Google
يطلب نموذج عنوان URL أدناه إذن الوصول بلا إنترنت
(access_type=offline
) إلى نطاق يسمح بالوصول إلى حساب المستخدم على YouTube وعرضه. يستخدم هذا النوع من الرموز التفويض المتزايد لضمان أنّ رمز الدخول الجديد يغطي أي نطاقات سبق أن منح المستخدم التطبيق إذن الوصول إليها. يحدّد عنوان URL أيضًا قيمًا للمعلمات المطلوبة redirect_uri
وresponse_type
وclient_id
، بالإضافة إلى المعلمة state
. يحتوي عنوان URL على فواصل أسطر ومسافات لتسهيل قراءته.
https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
include_granted_scopes=true&
state=state_parameter_passthrough_value&
redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
response_type=token&
client_id=client_id
بعد إنشاء عنوان URL للطلب، أعِد توجيه المستخدم إليه.
نموذج لرمز JavaScript
تعرض مقتطفة JavaScript التالية كيفية بدء عملية منح الإذن في JavaScript بدون استخدام Google APIs Client Library for JavaScript. بما أنّ نقطة نهاية OAuth 2.0 هذه لا تتيح مشاركة الموارد المتعدّدة المصادر (CORS)، ينشئ المقتطف نموذجًا يفتح الطلب إلى نقطة النهاية هذه.
/* * Create form to request access token from Google's OAuth 2.0 server. */ function oauthSignIn() { // Google's OAuth 2.0 endpoint for requesting an access token var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth'; // Create <form> element to submit parameters to OAuth 2.0 endpoint. var form = document.createElement('form'); form.setAttribute('method', 'GET'); // Send as a GET request. form.setAttribute('action', oauth2Endpoint); // Parameters to pass to OAuth 2.0 endpoint. var params = {'client_id': 'YOUR_CLIENT_ID', 'redirect_uri': 'YOUR_REDIRECT_URI', 'response_type': 'token', 'scope': 'https://www.googleapis.com/auth/youtube.force-ssl', 'include_granted_scopes': 'true', 'state': 'pass-through value'}; // Add form parameters as hidden input values. for (var p in params) { var input = document.createElement('input'); input.setAttribute('type', 'hidden'); input.setAttribute('name', p); input.setAttribute('value', params[p]); form.appendChild(input); } // Add form to page and submit it to open the OAuth 2.0 endpoint. document.body.appendChild(form); form.submit(); }
الخطوة 2: تطلب Google من المستخدم تقديم موافقته
في هذه الخطوة، يقرّر المستخدم ما إذا كان سيمنح تطبيقك إذن الوصول المطلوب. في هذه المرحلة، يعرض Google نافذة موافقة تعرض اسم تطبيقك وخدمات Google API التي يطلب الإذن بالوصول إليها باستخدام بيانات اعتماد تفويض المستخدم وملخّصًا لنطاقات الوصول التي سيتم منحها. يمكن للمستخدم بعد ذلك الموافقة على منح إذن الوصول إلى نطاق واحد أو أكثر يطلبه تطبيقك أو رفض الطلب.
لا يحتاج تطبيقك إلى اتّخاذ أي إجراء في هذه المرحلة، إذ ينتظر الردّ من خادم OAuth 2.0 التابع لـ Google الذي يوضّح ما إذا تم منح أي إذن بالوصول. يتم توضيح هذا الرد في الخطوة التالية.
الأخطاء
قد تعرض الطلبات المُرسَلة إلى نقطة نهاية تفويض OAuth 2.0 من Google رسائل خطأ موجّهة إلى المستخدمين بدلاً من عمليات المصادقة والتفويض المتوقّعة. في ما يلي رموز الأخطاء الشائعة والحلول المقترَحة.
admin_policy_enforced
لا يمكن لحساب Google منح الإذن باستخدام نطاق واحد أو أكثر من النطاقات المطلوبة بسبب سياسات مشرف Google Workspace. راجِع مقالة المساعدة في "مشرف Google Workspace" بعنوان التحكّم في اختيار التطبيقات الخارجية والتطبيقات الداخلية التي يمكنها الوصول إلى بيانات Google Workspace لمزيد من المعلومات حول كيفية حظر المشرف للوصول إلى جميع النطاقات أو النطاقات الحسّاسة والمقيّدة إلى أن يتم منح إذن الوصول بشكل صريح إلى معرّف عميل OAuth.
disallowed_useragent
يتم عرض نقطة نهاية التفويض داخل وكيل مستخدم مضمّن غير مسموح به بموجب سياسات OAuth 2.0 من Google.
Android
قد تظهر رسالة الخطأ هذه لمطوّري تطبيقات Android عند فتح طلبات التفويض في
android.webkit.WebView
.
على المطوّرين بدلاً من ذلك استخدام مكتبات Android، مثل
تسجيل الدخول باستخدام حساب Google على Android أو
AppAuth لنظام التشغيل Android من OpenID Foundation.
قد يواجه مطوّرو الويب هذا الخطأ عندما يفتح تطبيق Android رابطًا عامًا على الويب في وكيل مستخدم مضمّن، وينتقل المستخدم إلى نقطة نهاية تفويض بروتوكول OAuth 2.0 من Google من موقعك الإلكتروني. على المطوّرين السماح بفتح الروابط العامة في معالج الروابط التلقائي لنظام التشغيل، والذي يتضمّن كلاً من معالجات روابط تطبيقات Android أو تطبيق المتصفّح التلقائي. وتُعد مكتبة علامات التبويب المخصّصة في Android أيضًا خيارًا متاحًا.
iOS
قد يواجه مطوّرو تطبيقات iOS وmacOS هذا الخطأ عند فتح طلبات الحصول على إذن في
WKWebView
.
على المطوّرين بدلاً من ذلك استخدام مكتبات iOS، مثل
Google Sign-In for iOS أو
AppAuth for iOS من OpenID Foundation.
قد يواجه مطوّرو الويب هذا الخطأ عندما يفتح تطبيق على iOS أو macOS رابط ويب عامًا في وكيل مستخدم مضمّن، وينتقِل المستخدم إلى نقطة نهاية تفويض بروتوكول OAuth 2.0 من Google من موقعك الإلكتروني. على المطوّرين السماح بفتح الروابط العامة في معالج الروابط التلقائي لنظام التشغيل، والذي يتضمّن معالجات الروابط العامة أو تطبيق المتصفّح التلقائي. وتُعد مكتبة SFSafariViewController
خيارًا متاحًا أيضًا.
org_internal
إنّ رقم تعريف عميل OAuth في الطلب هو جزء من مشروع يحدّ من الوصول إلى حسابات Google في مؤسسة Google Cloud محدّدة. لمزيد من المعلومات حول خيار الإعداد هذا، راجِع قسم نوع المستخدم في مقالة المساعدة حول إعداد شاشة موافقة OAuth.
invalid_client
لا يُسمح للمصدر الذي تم إرسال الطلب منه لهذا العميل. يمكنك الاطّلاع على
origin_mismatch
.
deleted_client
تم حذف عميل OAuth المستخدَم لتقديم الطلب. يمكن أن تتم عملية الحذف يدويًا أو تلقائيًا في حالة العملاء غير النشطين . يمكن استعادة العملاء المحذوفين في غضون 30 يومًا من الحذف. مزيد من المعلومات
invalid_grant
عند استخدام تفويض متزايد، قد تكون انتهت صلاحية الرمز المميز أو تم إبطاله. أثبِت هوية المستخدم مرة أخرى واطلب موافقته للحصول على رموز مميزة جديدة. إذا استمر ظهور هذا الخطأ، تأكَّد من إعداد تطبيقك بشكل صحيح ومن استخدام الرموز المميزة والمَعلمات الصحيحة في طلبك. بخلاف ذلك، قد يكون قد تم حذف حساب المستخدم أو إيقافه.
origin_mismatch
قد لا يتطابق المخطط أو النطاق أو المنفذ أو جميعها في JavaScript الذي ينشئ طلب التفويض مع معرّف الموارد المنتظم (URI) لمصدر JavaScript المسموح به والمُسجَّل لمعرّف عميل OAuth. راجِع مصادر JavaScript المعتمدة في .
redirect_uri_mismatch
لا يتطابق redirect_uri
الذي تم تمريره في طلب التفويض مع معرّف الموارد المنتظم (URI) لإعادة التوجيه المصرّح به لمعرّف عميل OAuth. راجِع معرّفات الموارد المنتظمة (URI) المعتمَدة لإعادة التوجيه في
.
قد لا يتطابق المخطط أو النطاق أو المنفذ أو جميعها في JavaScript الذي ينشئ طلب التفويض مع معرّف الموارد المنتظم (URI) لمصدر JavaScript المسموح به والمُسجَّل لمعرّف عميل OAuth. راجِع مصادر JavaScript المعتمدة في .
قد تشير المَعلمة redirect_uri
إلى مسار OAuth خارج النطاق (OOB) الذي تم إيقافه نهائيًا ولم يعُد متاحًا. راجِع دليل نقل البيانات لتعديل عملية الدمج.
invalid_request
حدث خطأ في الطلب الذي قدّمته. قد يرجع ذلك إلى عدة أسباب:
- لم يتم تنسيق الطلب بشكلٍ صحيح
- لم يتضمّن الطلب المَعلمات المطلوبة
- يستخدم الطلب طريقة لا تسمح بها Google لمنح إذن الوصول. التأكّد من أنّ عملية دمج OAuth تستخدم طريقة دمج مقترَحة
الخطوة 3: التعامل مع استجابة خادم OAuth 2.0
نقاط نهاية OAuth 2.0
يرسل خادم OAuth 2.0 استجابة إلى redirect_uri
المحدّد في طلب الرمز المميز للوصول.
إذا وافق المستخدم على الطلب، ستتضمّن الاستجابة رمز دخول. إذا لم يوافق المستخدم على الطلب، سيتضمّن الرد رسالة خطأ. يتم عرض رمز الدخول أو رسالة الخطأ في جزء التجزئة من معرّف الموارد المنتظم (URI) الخاص بإعادة التوجيه، كما هو موضّح أدناه:
ردّ رمز الدخول:
https://oauth2.example.com/callback#access_token=4/P7q7W91&token_type=Bearer&expires_in=3600
بالإضافة إلى المَعلمة
access_token
، يحتوي سلسلة الجزء أيضًا على المَعلمةtoken_type
، التي يتم ضبطها دائمًا علىBearer
، والمَعلمةexpires_in
، التي تحدّد مدة صلاحية الرمز المميز بالثواني. إذا تم تحديد المَعلمةstate
في طلب الرمز المميّز للوصول، سيتم أيضًا تضمين قيمتها في الردّ.- استجابة تتضمّن خطأ:
https://oauth2.example.com/callback#error=access_denied
نموذج استجابة خادم OAuth 2.0
يمكنك اختبار هذا المسار من خلال النقر على عنوان URL النموذجي التالي الذي يطلب إذنًا بالقراءة فقط لعرض البيانات الوصفية للملفات في Google Drive وإذنًا بالقراءة فقط لعرض أحداث "تقويم Google":
https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly& include_granted_scopes=true& state=state_parameter_passthrough_value& redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback& response_type=token& client_id=client_id
بعد إكمال مسار OAuth 2.0، ستتم إعادة توجيهك إلى http://localhost/oauth2callback
. سيؤدي عنوان URL هذا إلى ظهور الخطأ 404 NOT FOUND
ما لم يكن جهازك المحلي يعرض ملفًا على هذا العنوان. تقدّم الخطوة التالية تفاصيل أكثر حول المعلومات التي يتم عرضها في معرّف الموارد المنتظم (URI) عند إعادة توجيه المستخدم إلى تطبيقك.
الخطوة 4: التحقّق من النطاقات التي منح المستخدمون إذن الوصول إليها
عند طلب أذونات متعددة (نطاقات)، قد لا يمنح المستخدمون تطبيقك إذن الوصول إلى جميعها. يجب أن يتحقّق تطبيقك من النطاقات التي تم منحها فعليًا وأن يتعامل بشكل سليم مع الحالات التي يتم فيها رفض بعض الأذونات، وذلك عادةً عن طريق إيقاف الميزات التي تعتمد على تلك النطاقات المرفوضة.
ومع ذلك، هناك استثناءات. تتجاوز تطبيقات Google Workspace Enterprise التي تتضمّن تفويضًا على مستوى النطاق، أو التطبيقات التي تم وضع علامة موثوق به عليها، شاشة طلب الموافقة على الأذونات التفصيلية. بالنسبة إلى هذه التطبيقات، لن تظهر للمستخدمين شاشة الموافقة على الأذونات التفصيلية. بدلاً من ذلك، سيحصل تطبيقك على جميع النطاقات المطلوبة أو لن يحصل على أي منها.
لمزيد من المعلومات التفصيلية، يُرجى الاطّلاع على كيفية التعامل مع الأذونات الدقيقة.
نقاط نهاية OAuth 2.0
للتحقّق مما إذا كان المستخدم قد منح تطبيقك إذن الوصول إلى نطاق معيّن،
افحص الحقل scope
في ردّ رمز الدخول. نطاقات الوصول التي يمنحها الرمز access_token، ويتم التعبير عنها كقائمة من السلاسل الحساسة لحالة الأحرف والمفصولة بمسافات
على سبيل المثال، يشير نموذج استجابة رمز الدخول التالي إلى أنّ المستخدم منح تطبيقك إذنًا بالاطّلاع على فيديوهات المستخدم وتقييماته وتعليقاته وترجماته على YouTube وتعديلها وحذفها نهائيًا:
{ "access_token": "1/fFAGRNJru1FTz70BzhT3Zg", "expires_in": 3920, "token_type": "Bearer", "scope": "https://www.googleapis.com/auth/youtube.force-ssl", "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" }
استدعاء Google APIs
نقاط نهاية OAuth 2.0
بعد أن يحصل تطبيقك على رمز مميز للوصول، يمكنك استخدام الرمز المميز لإجراء طلبات إلى إحدى واجهات برمجة التطبيقات من Google نيابةً عن حساب مستخدم معيّن إذا تم منح نطاقات الوصول التي تتطلّبها واجهة برمجة التطبيقات. لإجراء ذلك، يجب تضمين رمز الدخول في طلب إلى واجهة برمجة التطبيقات من خلال تضمين مَعلمة طلب بحث access_token
أو قيمة Bearer
في عنوان HTTP Authorization
. عند الإمكان، من الأفضل استخدام عنوان HTTP لأنّ سلاسل طلب البحث تكون عادةً مرئية في سجلات الخادم. في معظم الحالات، يمكنك استخدام مكتبة برامج لإعداد طلباتك إلى واجهات Google API (على سبيل المثال، عند استدعاء YouTube Data API).
يُرجى العِلم أنّ YouTube Data API لا يتيح استخدام حسابات الخدمة إلا لمالكي المحتوى على YouTube الذين يملكون ويديرون قنوات متعدّدة على YouTube، مثل شركات الإنتاج واستوديوهات الأفلام.
يمكنك تجربة جميع واجهات Google APIs والاطّلاع على نطاقاتها في مساحة بروتوكول OAuth 2.0.
أمثلة على طلبات HTTP GET
قد يبدو طلب إلى نقطة النهاية
youtube.channels
(YouTube Data API) باستخدام عنوان Authorization: Bearer
HTTP على النحو التالي. يُرجى العِلم أنّه عليك تحديد رمز الدخول الخاص بك:
GET /youtube/v3/channels?part=snippet&mine=true HTTP/1.1 Host: www.googleapis.com Authorization: Bearer access_token
في ما يلي طلب موجّه إلى واجهة برمجة التطبيقات نفسها للمستخدم الذي تمّت المصادقة عليه باستخدام مَعلمة سلسلة طلب البحث access_token
:
GET https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true
أمثلة على curl
يمكنك اختبار هذه الأوامر باستخدام تطبيق سطر الأوامر curl
. في ما يلي مثال يستخدم خيار عنوان HTTP (الخيار المفضّل):
curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true
أو يمكنك استخدام خيار مَعلمة سلسلة طلب البحث:
curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true
نموذج لرمز JavaScript
يوضّح مقتطف الرمز البرمجي أدناه كيفية استخدام مشاركة الموارد المتعدّدة المصادر (CORS) لإرسال طلب إلى إحدى واجهات Google API. لا يستخدم هذا المثال مكتبة Google APIs Client Library for JavaScript. ومع ذلك، حتى إذا كنت لا تستخدم مكتبة البرامج، من المرجّح أن يساعدك دليل إتاحة CORS في مستندات هذه المكتبة على فهم هذه الطلبات بشكل أفضل.
في مقتطف الرمز البرمجي هذا، يمثّل المتغيّر access_token
الرمز المميّز الذي حصلت عليه لتقديم طلبات إلى واجهة برمجة التطبيقات نيابةً عن المستخدم المفوَّض. يوضّح المثال الكامل كيفية تخزين هذا الرمز المميز في وحدة التخزين المحلية للمتصفّح واسترداده عند تقديم طلب إلى واجهة برمجة التطبيقات.
var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true&' + 'access_token=' + params['access_token']); xhr.onreadystatechange = function (e) { console.log(xhr.response); }; xhr.send(null);
مثال كامل
نقاط نهاية OAuth 2.0
يوضّح نموذج الرمز البرمجي هذا كيفية إكمال عملية OAuth 2.0 في JavaScript بدون استخدام مكتبة عميل Google APIs للغة JavaScript. الرمز مخصّص لصفحة HTML تعرض زرًا لتجربة طلب من واجهة برمجة التطبيقات. إذا نقرت على الزر، سيتأكّد الرمز مما إذا كانت الصفحة قد خزّنت رمزًا مميزًا للوصول إلى واجهة برمجة التطبيقات في مساحة التخزين المحلية للمتصفّح. وفي حال توفّرها، يتم تنفيذ طلب البيانات من واجهة برمجة التطبيقات. بخلاف ذلك، يبدأ مسار OAuth 2.0.
بالنسبة إلى مسار OAuth 2.0، تتّبع الصفحة الخطوات التالية:
- ويتم توجيه المستخدم إلى خادم OAuth 2.0 من Google الذي يطلب الوصول إلى النطاق
https://www.googleapis.com/auth/youtube.force-ssl
. - بعد منح (أو رفض) إذن الوصول إلى نطاق واحد أو أكثر من النطاقات المطلوبة، تتم إعادة توجيه المستخدم إلى الصفحة الأصلية التي تحلّل رمز الدخول من سلسلة معرّف الجزء.
- تتحقّق الصفحة من النطاقات التي منح المستخدم إذن الوصول إليها في التطبيق.
إذا منح المستخدم إذن الوصول إلى النطاقات المطلوبة، تستخدم الصفحة رمز الدخول لإرسال طلب نموذج لواجهة برمجة التطبيقات.
يطلب هذا الطلب من واجهة برمجة التطبيقات استدعاء طريقة
channels.list
في YouTube Data API لاسترداد بيانات حول قناة المستخدم المصرّح له على YouTube.- إذا تم تنفيذ الطلب بنجاح، سيتم تسجيل استجابة واجهة برمجة التطبيقات في وحدة تحكّم تصحيح الأخطاء في المتصفّح.
يمكنك إبطال إذن الوصول إلى التطبيق من خلال صفحة الأذونات في حسابك على Google. سيتم إدراج التطبيق باسم عرض توضيحي لبروتوكول OAuth 2.0 في مستندات Google API.
لتشغيل هذا الرمز برمجيًا بشكل محلي، عليك ضبط قيم للمتغيرَين YOUR_CLIENT_ID
وYOUR_REDIRECT_URI
تتوافق مع بيانات اعتماد التفويض. يجب ضبط المتغيّر YOUR_REDIRECT_URI
على عنوان URL نفسه الذي يتم عرض الصفحة عليه. يجب أن تتطابق القيمة تمامًا مع أحد معرّفات الموارد المنتظمة (URI) المسموح بها لإعادة التوجيه الخاصة بعميل OAuth 2.0 الذي تم إعداده في
. إذا لم تتطابق هذه القيمة مع معرّف URI معتمَد، سيظهر لك الخطأ redirect_uri_mismatch
. يجب أيضًا أن يكون مشروعك قد فعّل واجهة برمجة التطبيقات المناسبة لهذا الطلب.
<html><head></head><body> <script> var YOUR_CLIENT_ID = 'REPLACE_THIS_VALUE'; var YOUR_REDIRECT_URI = 'REPLACE_THIS_VALUE'; // Parse query string to see if page request is coming from OAuth 2.0 server. var fragmentString = location.hash.substring(1); var params = {}; var regex = /([^&=]+)=([^&]*)/g, m; while (m = regex.exec(fragmentString)) { params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]); } if (Object.keys(params).length > 0 && params['state']) { if (params['state'] == localStorage.getItem('state')) { localStorage.setItem('oauth2-test-params', JSON.stringify(params) ); trySampleRequest(); } else { console.log('State mismatch. Possible CSRF attack'); } } // Function to generate a random state value function generateCryptoRandomState() { const randomValues = new Uint32Array(2); window.crypto.getRandomValues(randomValues); // Encode as UTF-8 const utf8Encoder = new TextEncoder(); const utf8Array = utf8Encoder.encode( String.fromCharCode.apply(null, randomValues) ); // Base64 encode the UTF-8 data return btoa(String.fromCharCode.apply(null, utf8Array)) .replace(/\+/g, '-') .replace(/\//g, '_') .replace(/=+$/, ''); } // If there's an access token, try an API request. // Otherwise, start OAuth 2.0 flow. function trySampleRequest() { var params = JSON.parse(localStorage.getItem('oauth2-test-params')); if (params && params['access_token']) { var xhr = new XMLHttpRequest(); xhr.open('GET', 'https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true&' + 'access_token=' + params['access_token']); xhr.onreadystatechange = function (e) { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.response); } else if (xhr.readyState === 4 && xhr.status === 401) { // Token invalid, so prompt for user permission. oauth2SignIn(); } }; xhr.send(null); } else { oauth2SignIn(); } } /* * Create form to request access token from Google's OAuth 2.0 server. */ function oauth2SignIn() { // create random state value and store in local storage var state = generateCryptoRandomState(); localStorage.setItem('state', state); // Google's OAuth 2.0 endpoint for requesting an access token var oauth2Endpoint = 'https://accounts.google.com/o/oauth2/v2/auth'; // Create element to open OAuth 2.0 endpoint in new window. var form = document.createElement('form'); form.setAttribute('method', 'GET'); // Send as a GET request. form.setAttribute('action', oauth2Endpoint); // Parameters to pass to OAuth 2.0 endpoint. var params = {'client_id': YOUR_CLIENT_ID, 'redirect_uri': YOUR_REDIRECT_URI, 'scope': 'https://www.googleapis.com/auth/youtube.force-ssl', 'state': state, 'include_granted_scopes': 'true', 'response_type': 'token'}; // Add form parameters as hidden input values. for (var p in params) { var input = document.createElement('input'); input.setAttribute('type', 'hidden'); input.setAttribute('name', p); input.setAttribute('value', params[p]); form.appendChild(input); } // Add form to page and submit it to open the OAuth 2.0 endpoint. document.body.appendChild(form); form.submit(); } </script> <button onclick="trySampleRequest();">Try sample request</button> </body></html>
قواعد التحقّق من مصدر JavaScript
تطبّق Google قواعد التحقّق التالية على مصادر JavaScript لمساعدة المطوّرين في الحفاظ على أمان تطبيقاتهم. يجب أن تلتزم مصادر JavaScript بالقواعد التالية. راجِع القسم 3 من RFC 3986 للاطّلاع على تعريف النطاق والمضيف والمخطط المذكورة أدناه.
قواعد التحقّق من الصحة | |
---|---|
المخطط |
يجب أن تستخدم مصادر JavaScript مخطط HTTPS، وليس HTTP العادي. يُستثنى من هذه القاعدة معرّفات الموارد المنتظمة (URI) الخاصة بالمضيف المحلي (بما في ذلك معرّفات الموارد المنتظمة (URI) الخاصة بعنوان IP الخاص بالمضيف المحلي). |
المضيف |
لا يمكن أن تكون المضيفات عناوين IP أولية. يتم استثناء عناوين IP الخاصة بالمضيف المحلي من هذه القاعدة. |
النطاق |
“googleusercontent.com” .goo.gl ) إلا إذا كان التطبيق يملك النطاق. |
Userinfo |
لا يمكن أن تحتوي مصادر JavaScript على المكوّن الفرعي userinfo. |
المسار |
لا يمكن أن تحتوي مصادر JavaScript على مكوّن المسار. |
طلب بحث |
لا يمكن أن تحتوي مصادر JavaScript على مكوّن طلب البحث. |
الجزء |
لا يمكن أن تحتوي مصادر JavaScript على مكوّن الجزء. |
الشخصيات |
لا يمكن أن تحتوي مصادر JavaScript على أحرف معيّنة، بما في ذلك:
|
تفويض تدريجي
في بروتوكول OAuth 2.0، يطلب تطبيقك الحصول على إذن بالوصول إلى الموارد التي يتم تحديدها من خلال النطاقات. يُعدّ طلب الحصول على إذن بالوصول إلى الموارد في الوقت الذي تحتاجها فيه من أفضل ممارسات تجربة المستخدم. ولتفعيل هذه الممارسة، يتيح خادم التفويض من Google التفويض التدريجي. تتيح لك هذه الميزة طلب النطاقات حسب الحاجة، وإذا منح المستخدم الإذن بالنطاق الجديد، سيتم عرض رمز تفويض يمكن استبداله برمز مميز يتضمّن جميع النطاقات التي منحها المستخدم للمشروع.
على سبيل المثال، لنفترض أنّ أحد التطبيقات يساعد المستخدمين في تحديد الأحداث المحلية المثيرة للاهتمام. يتيح التطبيق للمستخدمين مشاهدة فيديوهات حول الفعاليات وتقييمها وإضافتها إلى قوائم تشغيل. يمكن للمستخدمين أيضًا استخدام التطبيق لإضافة أحداث إلى تقويماتهم على Google.
في هذه الحالة، قد لا يحتاج التطبيق إلى طلب الوصول إلى أي نطاقات عند تسجيل الدخول. ومع ذلك، إذا حاول المستخدم تقييم فيديو أو إضافة فيديو إلى قائمة تشغيل أو تنفيذ إجراء آخر على YouTube، قد يطلب التطبيق الوصول إلى النطاق https://www.googleapis.com/auth/youtube.force-ssl
.
وبالمثل، يمكن أن يطلب التطبيق الوصول إلى النطاق https://www.googleapis.com/auth/calendar
إذا حاول المستخدم إضافة حدث في التقويم.
تنطبق القواعد التالية على رمز الدخول الذي تم الحصول عليه من تفويض تدريجي:
- يمكن استخدام الرمز المميز للوصول إلى الموارد التي تتوافق مع أي من النطاقات المضمّنة في التفويض الجديد المدمج.
- عند استخدام الرمز المميز لإعادة التحميل للحصول على رمز دخول من خلال التفويض المجمّع، يمثّل رمز الدخول التفويض المجمّع ويمكن استخدامه لأي من قيم
scope
المضمّنة في الرد. - يتضمّن التفويض المجمّع جميع النطاقات التي منحها المستخدم لمشروع واجهة برمجة التطبيقات، حتى إذا تم طلب منحها من برامج عملاء مختلفة. على سبيل المثال، إذا منح مستخدم إذن الوصول إلى نطاق واحد باستخدام برنامج تطبيق على الكمبيوتر المكتبي، ثم منح نطاقًا آخر للتطبيق نفسه من خلال برنامج تطبيق على الجهاز الجوّال، سيشمل التفويض المجمّع كلا النطاقين.
- في حال إبطال رمز مميّز يمثّل تفويضًا مجمّعًا، سيتم إبطال إذن الوصول إلى جميع نطاقات هذا التفويض نيابةً عن المستخدم المرتبط به في الوقت نفسه.
توضّح نماذج الرموز البرمجية أدناه كيفية إضافة نطاقات إلى رمز دخول حالي. تتيح هذه الطريقة لتطبيقك تجنُّب الحاجة إلى إدارة رموز وصول متعددة.
نقاط نهاية OAuth 2.0
في هذا المثال، يطلب تطبيق الاتصال إذنًا بالوصول إلى بيانات "إحصاءات YouTube" الخاصة بالمستخدم بالإضافة إلى أي أذونات أخرى سبق أن منحها المستخدم للتطبيق.
لإضافة نطاقات إلى رمز دخول حالي، أدرِج المَعلمة include_granted_scopes
في طلبك إلى خادم OAuth 2.0 من Google.
يوضّح مقتطف الرمز البرمجي التالي كيفية إجراء ذلك. يفترض المقتطف أنّك خزّنت النطاقات التي يكون رمز الدخول صالحًا لها في مساحة التخزين المحلية للمتصفّح. (يخزّن رمز المثال الكامل قائمة بالنطاقات التي يكون رمز الدخول صالحًا لها من خلال ضبط السمة oauth2-test-params.scope
في مساحة التخزين المحلية للمتصفّح).
يقارن المقتطف النطاقات التي يكون رمز الدخول صالحًا لها بالنطاق الذي تريد استخدامه في طلب بحث معيّن. إذا لم يكن رمز الدخول يغطي هذا النطاق، ستبدأ عملية OAuth 2.0.
في هذا المثال، تكون الدالة oauth2SignIn
هي نفسها الدالة التي تم تقديمها في الخطوة 2 (والتي سيتم تقديمها لاحقًا في المثال الكامل).
var SCOPE = 'https://www.googleapis.com/auth/youtube.force-ssl'; var params = JSON.parse(localStorage.getItem('oauth2-test-params')); var current_scope_granted = false; if (params.hasOwnProperty('scope')) { var scopes = params['scope'].split(' '); for (var s = 0; s < scopes.length; s++) { if (SCOPE == scopes[s]) { current_scope_granted = true; } } } if (!current_scope_granted) { oauth2SignIn(); // This function is defined elsewhere in this document. } else { // Since you already have access, you can proceed with the API request. }
إبطال رمز مميّز
في بعض الحالات، قد يرغب المستخدم في إبطال إذن الوصول الذي تم منحه لتطبيق. يمكن للمستخدم إبطال إذن الوصول من خلال الانتقال إلى إعدادات الحساب. للحصول على مزيد من المعلومات، يمكنك الاطّلاع على قسم إزالة إمكانية وصول موقع إلكتروني أو تطبيق في مستند الدعم "المواقع الإلكترونية والتطبيقات الخارجية التي يمكنها الوصول إلى حسابك".
من الممكن أيضًا أن يلغي تطبيق إذن الوصول الذي تم منحه له بشكل آلي. ويكون الإبطال آليًا مهمًا في الحالات التي يلغي فيها المستخدم اشتراكه أو يزيل تطبيقًا أو تتغير فيها بشكل كبير موارد واجهة برمجة التطبيقات التي يتطلبها التطبيق. بعبارة أخرى، يمكن أن يتضمّن جزء من عملية الإزالة طلبًا من خلال واجهة برمجة التطبيقات لضمان إزالة الأذونات التي تم منحها للتطبيق سابقًا.
نقاط نهاية OAuth 2.0
لإبطال رمز مميّز آليًا، يرسل تطبيقك طلبًا إلى
https://oauth2.googleapis.com/revoke
ويتضمّن الرمز المميّز كمعلَمة:
curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \ https://oauth2.googleapis.com/revoke?token={token}
يمكن أن يكون الرمز المميز رمز دخول أو رمز إعادة تحميل. إذا كان الرمز المميز هو رمز دخول وكان يتضمّن رمزًا مميزًا لإعادة التحميل، سيتم أيضًا إبطال رمز إعادة التحميل.
إذا تمت معالجة الإلغاء بنجاح، سيكون رمز حالة HTTP للاستجابة هو 200
. في حال حدوث خطأ، يتم عرض رمز حالة HTTP 400
مع رمز خطأ.
يوضّح مقتطف JavaScript التالي كيفية إبطال رمز مميّز في JavaScript بدون استخدام
Google APIs Client Library for JavaScript. بما أنّ نقطة نهاية OAuth 2.0 من Google لإبطال الرموز المميزة لا تتوافق مع سياسة مشاركة الموارد متعددة المصادر (CORS)، ينشئ الرمز نموذجًا ويرسله إلى نقطة النهاية بدلاً من استخدام طريقة XMLHttpRequest()
لنشر الطلب.
function revokeAccess(accessToken) { // Google's OAuth 2.0 endpoint for revoking access tokens. var revokeTokenEndpoint = 'https://oauth2.googleapis.com/revoke'; // Create <form> element to use to POST data to the OAuth 2.0 endpoint. var form = document.createElement('form'); form.setAttribute('method', 'post'); form.setAttribute('action', revokeTokenEndpoint); // Add access token to the form so it is set as value of 'token' parameter. // This corresponds to the sample curl request, where the URL is: // https://oauth2.googleapis.com/revoke?token={token} var tokenField = document.createElement('input'); tokenField.setAttribute('type', 'hidden'); tokenField.setAttribute('name', 'token'); tokenField.setAttribute('value', accessToken); form.appendChild(tokenField); // Add form to page and submit it to actually revoke the token. document.body.appendChild(form); form.submit(); }
تفعيل ميزة "الحماية العابرة للحساب"
من الخطوات الإضافية التي يجب اتّخاذها لحماية حسابات المستخدمين تنفيذ ميزة "الحماية على مستوى الحسابات" من خلال الاستفادة من خدمة "الحماية على مستوى الحسابات" من Google. تتيح لك هذه الخدمة الاشتراك في تلقّي إشعارات بشأن أحداث الأمان التي تقدّم معلومات لتطبيقك حول التغييرات الرئيسية التي تطرأ على حساب المستخدم. يمكنك بعد ذلك استخدام المعلومات لاتّخاذ إجراءات استنادًا إلى طريقة الردّ على الأحداث.
في ما يلي بعض الأمثلة على أنواع الأحداث التي ترسلها خدمة "الحماية على مستوى الحسابات" من Google إلى تطبيقك:
-
https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
-
https://schemas.openid.net/secevent/oauth/event-type/token-revoked
-
https://schemas.openid.net/secevent/risc/event-type/account-disabled
يمكنك الاطّلاع على صفحة حماية حسابات المستخدمين باستخدام ميزة "الحماية العابرة للحساب" للحصول على مزيد من المعلومات حول كيفية تنفيذ ميزة "الحماية العابرة للحساب" والقائمة الكاملة بالأحداث المتاحة.