نظرة عامة
من خلال الأذونات الدقيقة، يحصل المستهلكون على تحكّم أكثر دقة في بيانات الحساب التي يختارون مشاركتها مع كل تطبيق، ما يعود بالنفع على المستخدمين والمطوّرين من خلال توفير قدر أكبر من التحكّم والشفافية والأمان. سيساعدك هذا الدليل في فهم التغييرات والخطوات اللازمة لتعديل تطبيقاتك بنجاح من أجل التعامل مع الأذونات الدقيقة.
ما هو الإذن الدقيق؟
لنفترض أنّك طوّرت تطبيقًا للإنتاجية يطلب نطاقَي البريد الإلكتروني والتقويم. قد يرغب المستخدمون في استخدام تطبيقك فقط مع "تقويم Google"، وليس مع Gmail. باستخدام أذونات OAuth الدقيقة، يمكن للمستخدمين اختيار منح الإذن لـ "تقويم Google" فقط بدون Gmail. من خلال السماح للمستخدمين بمنح إذن الوصول إلى بيانات معيّنة، يتم الحدّ من تعرُّض البيانات للخطر وتعزيز الثقة ومنح المستخدمين تحكّمًا يراعي الخصوصية في حياتهم الرقمية. من المهم تصميم تطبيقك للتعامل مع هذه السيناريوهات.
عند طلب أكثر من نطاق واحد غير مرتبط بميزة "تسجيل الدخول"
نطاقات تسجيل الدخول والنطاقات التي لا تتطلّب تسجيل الدخول
بالنسبة إلى التطبيقات التي تطلب نطاقات تسجيل الدخول وغير تسجيل الدخول، تظهر للمستخدمين أولاً شاشة طلب الموافقة على نطاقات تسجيل الدخول (email وprofile وopenid). وبعد موافقة المستخدمين على مشاركة معلومات الهوية الأساسية (الاسم وعنوان البريد الإلكتروني وصورة الملف الشخصي)، ستظهر لهم شاشة طلب موافقة على الأذونات الدقيقة لنطاقات غير تسجيل الدخول. في هذه الحالة، يجب أن يتحقّق التطبيق من النطاقات التي يمنحها المستخدمون، ولا يمكنه افتراض أنّ المستخدمين يمنحون جميع النطاقات المطلوبة. في المثال التالي، يطلب تطبيق الويب جميع نطاقات تسجيل الدخول ونطاقًا غير مرتبط بتسجيل الدخول في Google Drive. بعد موافقة المستخدمين على نطاقات تسجيل الدخول، ستظهر لهم شاشة طلب الموافقة على الأذونات التفصيلية الخاصة بإذن Google Drive:
أكثر من نطاق واحد غير Sign-In
سيتم عرض شاشة طلب الموافقة على الأذونات الدقيقة للمستخدمين عندما تطلب التطبيقات أكثر من نطاق واحد غير مرتبط بتسجيل الدخول. يمكن للمستخدمين اختيار الأذونات التي يريدون الموافقة عليها لمشاركتها مع التطبيق. في ما يلي مثال على شاشة طلب الموافقة على أذونات دقيقة تطلب الوصول إلى رسائل Gmail وبيانات "تقويم Google" الخاصة بالمستخدم:
بالنسبة إلى التطبيقات التي تطلب نطاقات تسجيل الدخول فقط (email وprofile وopenid)، لا تنطبق شاشة طلب الموافقة على الأذونات الدقيقة. يوافق المستخدمون على طلب تسجيل الدخول بأكمله أو يرفضونه. بمعنى آخر، إذا طلبت التطبيقات نطاقات تسجيل الدخول فقط (واحد أو اثنان أو ثلاثة جميعها)، لن تنطبق شاشة طلب الموافقة على الأذونات التفصيلية.
بالنسبة إلى التطبيقات التي تطلب نطاقًا واحدًا فقط من النطاقات غير المرتبطة بتسجيل الدخول، لا تنطبق شاشة طلب الموافقة على الأذونات الدقيقة. بعبارة أخرى، يوافق المستخدمون على الطلب بأكمله أو يرفضونه، ولا يتوفّر مربّع اختيار في شاشة طلب الموافقة. يلخّص الجدول التالي الحالات التي تظهر فيها شاشة طلب الموافقة على الأذونات التفصيلية.
| عدد نطاقات تسجيل الدخول | عدد النطاقات التي لا تتطلّب تسجيل الدخول | شاشة طلب الموافقة على الأذونات الدقيقة |
|---|---|---|
| 1-3 | 0 | لا تنطبق |
| 1-3 | 1 أو أكثر | قابلة للتطبيق |
| 0 | 1 | لا تنطبق |
| 0 | 2+ | قابلة للتطبيق |
تحديد ما إذا كانت تطبيقاتك متأثرة
أجرِ مراجعة شاملة لجميع الأقسام في تطبيقك التي يتم فيها استخدام نقاط نهاية تفويض Google OAuth 2.0 لطلبات الأذونات. انتبه إلى التطبيقات التي تطلب نطاقات متعدّدة لأنّها تفعّل شاشات الموافقة على الأذونات الدقيقة التي يتم عرضها للمستخدمين. في مثل هذه الحالات، تأكَّد من أنّ الرمز البرمجي يمكنه التعامل مع الحالة التي يمنح فيها المستخدمون الإذن ببعض النطاقات فقط.
كيفية تحديد ما إذا كان تطبيقك يستخدم نطاقات متعددة
افحص رمز تطبيقك أو طلب الشبكة الصادر لتحديد ما إذا كانت طلبات تفويض Google OAuth 2.0 التي يرسلها تطبيقك ستؤدي إلى ظهور شاشة طلب الموافقة على الأذونات الدقيقة.
فحص الرمز البرمجي للتطبيق
راجِع أقسام الرمز البرمجي لتطبيقك التي تُجري فيها طلبات إلى نقاط نهاية تفويض Google OAuth لطلب الإذن من المستخدمين. إذا كنت تستخدم إحدى مكتبات برامج Google API، يمكنك غالبًا العثور على النطاقات التي يطلبها تطبيقك في خطوات إعداد العميل. تظهر بعض الأمثلة في القسم التالي. يجب الرجوع إلى مستندات حِزم تطوير البرامج (SDK) التي يستخدمها تطبيقك للتعامل مع Google OAuth 2.0 لتحديد ما إذا كان تطبيقك سيتأثر، وذلك باستخدام الإرشادات الواردة في الأمثلة التالية كمرجع.
Google Identity Services
يؤدي مقتطف الرمز البرمجي التالي لمكتبة JavaScript الخاصة بخدمات Google Identity Services إلى تهيئة TokenClient بنطاقات متعددة غير مرتبطة بخدمة "تسجيل الدخول باستخدام Google". ستظهر شاشة طلب الموافقة على الأذونات التفصيلية عندما يطلب تطبيق الويب الحصول على إذن من المستخدمين.
const client = google.accounts.oauth2.initTokenClient({ client_id: 'YOUR_CLIENT_ID', scope: 'https://www.googleapis.com/auth/calendar.readonly \ https://www.googleapis.com/auth/contacts.readonly', callback: (response) => { ... }, });
Python
يستخدم مقتطف الرمز التالي الوحدة google-auth-oauthlib.flow لإنشاء طلب التفويض. تتضمّن المَعلمة scope نطاقَين غير مرتبطَين بميزة "الدخول باستخدام Google". ستظهر شاشة طلب الموافقة على الأذونات التفصيلية عندما يطلب تطبيق الويب الحصول على إذن من المستخدمين.
import google.oauth2.credentials import google_auth_oauthlib.flow # Use the client_secret.json file to identify the application requesting # authorization. The client ID (from that file) and access scopes are required. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( 'client_secret.json', scopes=['https://www.googleapis.com/auth/calendar.readonly', 'https://www.googleapis.com/auth/contacts.readonly'])
Node.js
ينشئ مقتطف الرمز التالي عنصر google.auth.OAuth2، الذي يحدّد المَعلمات في طلب التفويض الذي تتضمّن المَعلمة scope فيه نطاقَين غير مرتبطَين بميزة "تسجيل الدخول". ستظهر شاشة طلب الموافقة على الأذونات التفصيلية عندما يطلب تطبيق الويب الحصول على إذن من المستخدمين.
const {google} = require('googleapis'); /** * To use OAuth2 authentication, we need access to a CLIENT_ID, CLIENT_SECRET, AND REDIRECT_URI * from the client_secret.json file. To get these credentials for your application, visit * https://console.cloud.google.com/apis/credentials. */ const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for read-only Calendar and Contacts. const scopes = [ 'https://www.googleapis.com/auth/calendar.readonly', 'https://www.googleapis.com/auth/contacts.readonly'] ]; // Generate a url that asks permissions const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', /** Pass in the scopes array defined above. * Alternatively, if only one scope is needed, you can pass a scope URL as a string */ scope: scopes, // Enable incremental authorization. Recommended as best practices. include_granted_scopes: true });
فحص مكالمة الشبكة الصادرة
- تطبيق الويب - فحص نشاط الشبكة على Chrome
- Android - فحص حركة بيانات الشبكة باستخدام "أداة فحص الشبكة"
-
تطبيقات Chrome
- انتقِل إلى صفحة إضافات Chrome.
- ضَع علامة في مربّع الاختيار وضع مطور البرامج في أعلى يسار صفحة الإضافة.
- اختَر الإضافة التي تريد تتبُّعها.
- انقر على رابط صفحة الخلفية في قسم فحص طرق العرض ضمن صفحة الإضافة.
- ستفتح نافذة منبثقة أدوات المطوّرين يمكنك من خلالها مراقبة حركة بيانات الشبكة في علامة التبويب "الشبكة"
- iOS - تحليل عدد الزيارات عبر بروتوكول HTTP باستخدام أداة Instruments
- تطبيقات الكمبيوتر: استخدام أداة لتسجيل بيانات الشبكة متوفّرة لنظام التشغيل الذي تم تطوير التطبيق من أجله
أثناء فحص طلبات الشبكة، ابحث عن الطلبات المُرسَلة إلى نقاط نهاية التفويض في Google OAuth وافحص المَعلمة scope.
تتسبّب هذه القيم في عرض شاشة طلب الموافقة على الأذونات التفصيلية.
تحتوي المَعلمة
scopeعلى نطاقات تسجيل الدخول ونطاقات أخرى.يحتوي نموذج الطلب التالي على جميع نطاقات تسجيل الدخول ونطاق واحد غير مرتبط بتسجيل الدخول لعرض البيانات الوصفية لملفات المستخدم على Google Drive:
https://accounts.google.com/o/oauth2/v2/auth? access_type=offline& scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile%20openid%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly& include_granted_scopes=true& response_type=code& redirect_uri=YOUR_REDIRECT_URL& client_id=YOUR_CLIENT_ID
تحتوي المَعلمة
scopeعلى أكثر من نطاق واحد غير Sign-In.يحتوي نموذج الطلب التالي على نطاقَين غير مرتبطَين بميزة "تسجيل الدخول باستخدام Google" لعرض البيانات الوصفية لمستخدم Google Drive وإدارة ملفات معيّنة في Google Drive:
https://accounts.google.com/o/oauth2/v2/auth? access_type=offline& scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.metadata.readonly%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive.file& include_granted_scopes=true& response_type=code& redirect_uri=YOUR_REDIRECT_URL& client_id=YOUR_CLIENT_ID
أفضل الممارسات للتعامل مع الأذونات الدقيقة
إذا تبيّن لك أنّ تطبيقك بحاجة إلى تحديث للتعامل مع الأذونات الدقيقة، عليك إجراء التعديلات اللازمة على الرمز البرمجي للتعامل بشكل صحيح مع الموافقة على نطاقات متعدّدة. يجب أن تمتثل جميع التطبيقات لأفضل الممارسات التالية:
- راجِع سياسة بيانات المستخدمين في خدمات Google API وتأكَّد من التزامك بها.
- طلب نطاقات محدّدة مطلوبة لتنفيذ مهمة يجب الالتزام بسياسة Google OAuth 2.0 التي تنص على عدم طلب سوى النطاقات التي تحتاج إليها. يجب تجنُّب طلب نطاقات متعدّدة عند تسجيل الدخول، إلا إذا كان ذلك ضروريًا للوظائف الأساسية لتطبيقك. ويمكن أن يؤدي تجميع عدّة نطاقات معًا، خاصةً للمستخدمين الجدد الذين لا يعرفون ميزات تطبيقك، إلى صعوبة فهمهم للحاجة إلى هذه الأذونات. قد يؤدي ذلك إلى إثارة المخاوف لدى المستخدمين وردعهم عن التفاعل مع تطبيقك.
- قدِّم للمستخدمين سببًا قبل طلب الحصول على إذن. اشرح بوضوح سبب حاجة تطبيقك إلى الإذن المطلوب، وما ستفعله ببيانات المستخدم، وكيف سيستفيد المستخدم من الموافقة على الطلب. تشير أبحاثنا إلى أنّ هذه التفسيرات تزيد من ثقة المستخدمين وتفاعلهم.
- استخدِم الموافقة المتزايدة عندما يطلب تطبيقك نطاقات لتجنُّب الحاجة إلى إدارة رموز وصول متعددة.
- التحقّق من النطاقات التي منحها المستخدمون عند طلب نطاقات متعدّدة في الوقت نفسه، قد لا يمنح المستخدمون تطبيقك جميع النطاقات التي يطلبها. يجب أن يتحقّق تطبيقك دائمًا من النطاقات التي منحها المستخدم وأن يتعامل مع أي رفض للنطاقات من خلال إيقاف الميزات ذات الصلة. اتّبِع سياسات Google OAuth 2.0 بشأن التعامل مع الموافقة على نطاقات متعدّدة، ولا تطلب من المستخدم الموافقة مرة أخرى إلا بعد أن يوضّح نيّته استخدام الميزة المحدّدة التي تتطلّب النطاق.
تعديل تطبيقك للتعامل مع الأذونات الدقيقة
تطبيقات Android
عليك الرجوع إلى مستندات حِزم تطوير البرامج (SDK) التي تستخدمها للتفاعل مع Google OAuth 2.0 وتعديل تطبيقك للتعامل مع الأذونات الدقيقة استنادًا إلى أفضل الممارسات.
إذا كنت تستخدم حزمة تطوير البرامج (SDK) الخاصة بـ
auth.api.signin
من "خدمات Play" للتفاعل مع Google OAuth 2.0، يمكنك استخدام الدالة
requestPermissions
لطلب أصغر مجموعة من النطاقات اللازمة،
والدالة
hasPermissions
للتحقّق من النطاقات التي منحها المستخدم عند
طلب أذونات دقيقة.
تطبيقات إضافات Chrome
يجب استخدام Chrome Identity API للعمل مع Google OAuth 2.0 استنادًا إلى أفضل الممارسات.
يوضّح المثال التالي كيفية التعامل مع الأذونات الدقيقة بشكلٍ سليم.
manifest.json
يعرِّف ملف البيان النموذجي نطاقَين غير مرتبطَين بميزة "تسجيل الدخول" لتطبيق إضافة Chrome.
{
"name": "Example Chrome extension application",
...
"permissions": [
"identity"
],
"oauth2" : {
"client_id": "YOUR_CLIENT_ID",
"scopes":["https://www.googleapis.com/auth/calendar.readonly",
"https://www.googleapis.com/auth/contacts.readonly"]
}
}الأسلوب غير صحيح
الكل أو لا شيء
ينقر المستخدمون على الزر لبدء عملية التفويض. يفترض مقتطف الرمز أنّه يتم عرض شاشة موافقة "الكل أو لا شيء" للمستخدمين بشأن النطاقَين المحدّدَين في ملف manifest.json. لا يتحقّق من النطاقات التي منحها المستخدمون.
oauth.js
... document.querySelector('button').addEventListener('click', function () { chrome.identity.getAuthToken({ interactive: true }, function (token) { if (token === undefined) { // User didn't authorize both scopes. // Updating the UX and application accordingly ... } else { // User authorized both or one of the scopes. // It neglects to check which scopes users granted and assumes users granted all scopes. // Calling the APIs, etc. ... } }); });
النهج الصحيح
أصغر النطاقات
اختيار أصغر مجموعة من النطاقات المطلوبة
يجب ألا يطلب التطبيق سوى أصغر مجموعة من النطاقات اللازمة. ننصح بأن يطلب تطبيقك نطاقًا واحدًا في كل مرة عند الحاجة إليه لإكمال مهمة.
في هذا المثال، من المفترض أنّ كلا النطاقَين المحدّدَين في ملف manifest.json هما أصغر مجموعة من النطاقات المطلوبة. يستخدم الملف oauth.js واجهة برمجة التطبيقات Chrome Identity API لبدء عملية التفويض مع Google. يجب الموافقة على
تفعيل الأذونات الدقيقة، حتى يتمكّن المستخدمون من التحكّم بشكل أكبر في منح الأذونات لتطبيقك. يجب أن يتعامل تطبيقك بشكل صحيح مع ردود المستخدمين من خلال التحقّق من النطاقات التي يمنح المستخدمون الإذن بالوصول إليها.
oauth.js
... document.querySelector('button').addEventListener('click', function () { chrome.identity.getAuthToken({ interactive: true, enableGranularPermissions: true }, function (token, grantedScopes) { if (token === undefined) { // User didn't authorize any scope. // Updating the UX and application accordingly ... } else { // User authorized the request. Now, check which scopes were granted. if (grantedScopes.includes('https://www.googleapis.com/auth/calendar.readonly')) { // User authorized Calendar read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Calendar read permission. // Update UX and application accordingly ... } if (grantedScopes.includes('https://www.googleapis.com/auth/contacts.readonly')) { // User authorized Contacts read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Contacts read permission. // Update UX and application accordingly ... } } }); });
تطبيقات iOS وiPadOS وmacOS
عليك الرجوع إلى مستندات حِزم تطوير البرامج (SDK) التي تستخدمها للتفاعل مع Google OAuth 2.0 وتعديل تطبيقك للتعامل مع الأذونات الدقيقة استنادًا إلى أفضل الممارسات.
إذا كنت تستخدم مكتبة تسجيل الدخول باستخدام حساب Google لنظامَي التشغيل iOS وmacOS للتفاعل مع Google OAuth 2.0، عليك مراجعة المستندات حول كيفية التعامل مع الأذونات الدقيقة.
تطبيقات الويب
عليك الرجوع إلى مستندات حِزم تطوير البرامج (SDK) التي تستخدمها للتفاعل مع Google OAuth 2.0 وتعديل تطبيقك للتعامل مع الأذونات الدقيقة استنادًا إلى أفضل الممارسات.
الوصول من جهة الخادم (بلا إنترنت)
- أنشئ خادمًا وحدِّد نقطة نهاية يمكن للجميع الوصول إليها لتلقّي رمز المصادقة.
- اضبط معرّف الموارد المنتظم (URI) لإعادة التوجيه لنقطة النهاية العامة في صفحة العملاء ضمن وحدة تحكّم Google Cloud.
يعرض مقتطف الرمز التالي مثالاً على طلبات NodeJS لنطاقَين غير مرتبطَين بميزة "تسجيل الدخول باستخدام Google". سيظهر للمستخدمين شاشة طلب الموافقة على الأذونات التفصيلية.
الأسلوب غير صحيح
الكل أو لا شيء
تتم إعادة توجيه المستخدمين إلى عنوان URL الخاص بالتفويض. يفترض مقتطف الرمز أنّه يتم عرض شاشة موافقة "الكل أو لا شيء" للمستخدمين بشأن النطاقَين المحدّدَين في مصفوفة scopes. لا يتحقّق من النطاقات التي منحها المستخدمون.
main.js
... const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for two non-Sign-In scopes - Google Calendar and Contacts const scopes = [ 'https://www.googleapis.com/auth/contacts.readonly', 'https://www.googleapis.com/auth/calendar.readonly' ]; // Generate a url that asks permissions for the Google Calendar and Contacts scopes const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', // Pass in the scopes array defined above scope: scopes, // Enable incremental authorization. Recommended as best practices. include_granted_scopes: true }); async function main() { const server = http.createServer(async function (req, res) { // Example on redirecting user to Google OAuth 2.0 server. if (req.url == '/') { res.writeHead(301, { "Location": authorizationUrl }); } // Receive the callback from Google OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the Google OAuth 2.0 server response let q = url.parse(req.url, true).query; if (q.error) { // User didn't authorize both scopes. // Updating the UX and application accordingly ... } else { // User authorized both or one of the scopes. // It neglects to check which scopes users granted and assumes users granted all scopes. // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); // Calling the APIs, etc. ... } } res.end(); }).listen(80); }
النهج الصحيح
أصغر نطاق
اختيار أصغر مجموعة من النطاقات المطلوبة
يجب ألا يطلب التطبيق سوى أصغر مجموعة من النطاقات اللازمة. ننصح بأن يطلب تطبيقك نطاقًا واحدًا في كل مرة عند الحاجة إليه لإكمال مهمة. عندما يطلب تطبيقك نطاقات، يجب أن يستخدم الموافقة المتزايدة لتجنُّب الحاجة إلى إدارة رموز مميزة متعددة للوصول.
إذا كان تطبيقك يحتاج إلى طلب نطاقات متعدّدة غير نطاق "تسجيل الدخول"، عليك دائمًا استخدام الموافقة المتزايدة عند الطلب والتحقّق من النطاقات التي منحها المستخدمون.
في هذا المثال، من المفترض أنّ النطاقَين المذكورَين مطلوبان لكي يعمل التطبيق بشكل سليم. يجب الموافقة على تفعيل الأذونات الدقيقة، حتى يتمكّن المستخدمون من التحكّم بشكل أكبر في منح الأذونات لتطبيقك. يجب أن يتعامل تطبيقك بشكل سليم مع ردود المستخدمين من خلال التحقّق من النطاقات التي منحوا الإذن بالوصول إليها.
main.js
... const oauth2Client = new google.auth.OAuth2( YOUR_CLIENT_ID, YOUR_CLIENT_SECRET, YOUR_REDIRECT_URL ); // Access scopes for two non-Sign-In scopes - Google Calendar and Contacts const scopes = [ 'https://www.googleapis.com/auth/contacts.readonly', 'https://www.googleapis.com/auth/calendar.readonly' ]; // Generate a url that asks permissions for the Google Calendar and Contacts scopes const authorizationUrl = oauth2Client.generateAuthUrl({ // 'online' (default) or 'offline' (gets refresh_token) access_type: 'offline', // Pass in the scopes array defined above scope: scopes, // Enable incremental authorization. Recommended as best practices. include_granted_scopes: true, // Set to true to enable more granular permissions for Google OAuth 2.0 client IDs created before 2019. // No effect for newer Google OAuth 2.0 client IDs, since more granular permissions is always enabled for them. enable_granular_consent: true }); async function main() { const server = http.createServer(async function (req, res) { // Redirect users to Google OAuth 2.0 server. if (req.url == '/') { res.writeHead(301, { "Location": authorizationUrl }); } // Receive the callback from Google OAuth 2.0 server. if (req.url.startsWith('/oauth2callback')) { // Handle the Google OAuth 2.0 server response let q = url.parse(req.url, true).query; if (q.error) { // User didn't authorize both scopes. // Updating the UX and application accordingly ... } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); // User authorized the request. Now, check which scopes were granted. if (tokens.scope.includes('https://www.googleapis.com/auth/calendar.readonly')) { // User authorized Calendar read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Calendar read permission. // Calling the APIs, etc. ... } // Check which scopes user granted the permission to application if (tokens.scope.includes('https://www.googleapis.com/auth/contacts.readonly')) { // User authorized Contacts read permission. // Calling the APIs, etc. ... } else { // User didn't authorize Contacts read permission. // Update UX and application accordingly ... } } } res.end(); }).listen(80); }
راجِع دليل تطبيقات الويب من جهة الخادم لمعرفة كيفية الوصول إلى واجهات Google APIs من التطبيقات المستندة إلى الخادم.
إذن الوصول من جهة العميل فقط
- بالنسبة إلى التطبيقات التي تستخدم مكتبة JavaScript الخاصة بخدمات Google Identity Services للتفاعل مع بروتوكول OAuth 2.0 من Google، عليك مراجعة هذا المستند حول كيفية التعامل مع الأذونات الدقيقة.
- بالنسبة إلى التطبيقات التي تجري عمليات طلب مباشرةً باستخدام JavaScript إلى نقاط نهاية تفويض Google OAuth 2.0، عليك مراجعة هذه المستندات حول التعامل مع الأذونات الدقيقة.
اختبار تطبيقك المعدَّل في التعامل مع الأذونات الدقيقة
- حدِّد جميع الحالات التي يمكن للمستخدمين فيها الاستجابة لطلبات الأذونات والسلوك المتوقّع من تطبيقك. على سبيل المثال، إذا وافق المستخدم على نطاقَين فقط من النطاقات الثلاثة المطلوبة، يجب أن يتصرّف تطبيقك وفقًا لذلك.
-
اختبِر تطبيقك مع تفعيل الأذونات الدقيقة. هناك طريقتان لتفعيل
الأذونات الدقيقة:
- راجِع شاشات موافقة OAuth 2.0 في تطبيقك لمعرفة ما إذا كانت الأذونات الدقيقة مفعّلة لتطبيقك. يمكنك أيضًا إنشاء معرّف عميل جديد على Google OAuth 2.0 للويب أو Android أو iOS من خلال وحدة تحكّم Google Cloud لأغراض الاختبار، لأنّ الأذونات الدقيقة تكون مفعّلة دائمًا لهذه المعرّفات.
-
اضبط المَعلمة
enable_granular_consentعلىtrueعند طلب نقاط نهاية التفويض في Google OAuth. تتيح بعض حِزم تطوير البرامج (SDK) استخدام هذه المَعلمة بشكل صريح. بالنسبة إلى الآخرين، راجِع المستندات لمعرفة كيفية إضافة هذه المَعلمة وقيمتها يدويًا. إذا كان التنفيذ لا يتيح إضافة المَعلمة، يمكنك إنشاء معرّف عميل جديد على Google OAuth 2.0 للويب أو Android أو iOS من خلال Google Cloud Console لأغراض الاختبار فقط كما هو موضّح في النقطة السابقة.
- عند اختبار تطبيقك المعدَّل، استخدِم حساب Google شخصيًا (@gmail.com) بدلاً من حساب Workspace. ويرجع ذلك إلى أنّ تطبيقات Workspace Enterprise التي تتضمّن تفويضًا على مستوى النطاق أو تم تصنيفها على أنّها موثوق بها لا تتأثر بالتغييرات التي تم إجراؤها على الأذونات الدقيقة في الوقت الحالي. لذلك، قد لا يؤدي الاختبار باستخدام حساب Workspace من مؤسستك إلى عرض شاشة طلب الموافقة الجديدة التي تتيح التحكّم الأدق بالأذونات على النحو المنشود.