نظرة عامة
من خلال الأذونات الدقيقة، يحصل المستهلكون على عناصر تحكُّم أكثر دقة في بيانات الحساب التي يختارون مشاركتها مع كل تطبيق. وهي تفيد المستخدمين والمطوّرين على حد سواء من خلال توفير قدر أكبر من التحكم والشفافية والأمان. سيساعدك هذا الدليل على فهم التغييرات والخطوات اللازمة لتعديل تطبيقاتك بنجاح من أجل معالجة الأذونات الدقيقة.
ما المقصود بالإذن الدقيق؟
تخيل أنك تطور تطبيق إنتاجية يطلب نطاقي البريد الإلكتروني والتقويم. قد يرغب المستخدمون في استخدام تطبيقك مع "تقويم Google" فقط، وليس على Gmail. من خلال أذونات OAuth الدقيقة، يمكن للمستخدمين اختيار منح الإذن لتطبيق "تقويم Google" فقط، وليس منح Gmail. ومن خلال السماح للمستخدمين بمنح إمكانية الوصول إلى بيانات محددة، يحدّ ذلك من تعرّضهم للبيانات ويعزز الثقة بهم ويتيح لهم التحكّم في حياتهم الرقمية مع التركيز على الخصوصية أولاً. من المهم تصميم تطبيقك للتعامل مع مثل هذه السيناريوهات.
عندما يتم طلب أكثر من نطاق واحد لا يتيح تسجيل الدخول
نطاقات تسجيل الدخول ونطاقاتها التي لا تحتوي على تسجيل الدخول
في التطبيقات التي تطلب نطاقات تسجيل الدخول وغير تسجيل الدخول، ستظهر للمستخدمين أولاً صفحة الموافقة لنطاقات تسجيل الدخول (email
وprofile
وopenid
). بعد موافقة المستخدمين على مشاركة معلومات هويتهم الأساسية (الاسم وعنوان البريد الإلكتروني وصورة الملف الشخصي)، ستظهر للمستخدمين شاشة دقيقة للموافقة على الأذونات للنطاقات التي لا تتضمن تسجيل الدخول. في هذه الحالة، يجب أن يتحقّق التطبيق من النطاقات التي يمنحها المستخدمون، ولا يمكنه افتراض أنّ المستخدمين منحوا جميع النطاقات المطلوبة. في المثال التالي، يطلب تطبيق الويب جميع نطاقات "تسجيل الدخول" الثلاثة ونطاق لا يتضمن ميزة "تسجيل الدخول" على Google Drive. بعد موافقة المستخدمين على نطاقات تسجيل الدخول، ستظهر للمستخدمين شاشة الموافقة على الأذونات الدقيقة لإذن Google Drive:
![نطاقات تسجيل الدخول ونطاقاتها التي لا تحتوي على تسجيل الدخول](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/protocols/oauth2/images/examples/identity-and-nonidentity.png?authuser=4&hl=ar)
أكثر من نطاق واحد لا يتضمّن تسجيل الدخول
سيتم عرض شاشة دقيقة لطلب الموافقة على الأذونات، وذلك عندما تطلب التطبيقات أكثر من نطاق واحد لا يتضمّن ميزة "تسجيل الدخول". يمكن للمستخدمين اختيار الأذونات التي يريدون الموافقة على مشاركتها مع التطبيق. في ما يلي مثال على شاشة الموافقة الدقيقة على الأذونات التي تطلب الوصول إلى رسائل Gmail وبيانات "تقويم Google" الخاصة بالمستخدم:
![أكثر من نطاق واحد لا يتضمّن تسجيل الدخول](https://developers-dot-devsite-v2-prod.appspot.com/static/identity/protocols/oauth2/images/examples/two-nonidentity.png?authuser=4&hl=ar)
بالنسبة إلى التطبيقات التي تطلب فقط نطاقات تسجيل الدخول (email
وprofile
وopenid
)، لا تسري شاشة الموافقة على الأذونات الدقيقة. ويمكن للمستخدمين الموافقة على طلب تسجيل الدخول
بأكمله أو رفضه. بتعبير آخر، إذا كانت التطبيقات لا تطلب سوى نطاقات تسجيل الدخول (واحد أو اثنتين أو الثلاثة جميعًا)، لن تكون شاشة الموافقة الدقيقة على الأذونات منطبقة.
بالنسبة إلى التطبيقات التي تطلب نطاقًا واحدًا فقط لا يسمح بتسجيل الدخول، لا تنطبق شاشة الموافقة الدقيقة على الأذونات. بعبارة أخرى، إما أن يوافق المستخدمون على الطلب بالكامل أو يرفضونه، ولا يظهر مربع اختيار في شاشة الموافقة. ويلخّص الجدول التالي حالات عرض شاشة الموافقة على الأذونات الدقيقة.
عدد نطاقات تسجيل الدخول | عدد النطاقات التي لم يتم تسجيل الدخول إليها | شاشة الموافقة على الأذونات الدقيقة |
---|---|---|
1-3 | 0 | غير منطبق |
1-3 | 1 أو أكثر | سارية |
0 | 1 | غير منطبق |
0 | 2+ | سارية |
تحديد ما إذا كانت تطبيقاتك ستتأثر
يُرجى إجراء مراجعة شاملة لجميع الأقسام داخل تطبيقك حيث يتم استخدام نقاط نهاية تفويض Google OAuth 2.0 لطلبات الأذونات. انتبِه إلى المستخدمين الذين يطلبون نطاقات متعددة أثناء تفعيل شاشات الموافقة الدقيقة على الأذونات التي يتم عرضها للمستخدمين. في هذه الحالات، تأكَّد من أنّ الرمز البرمجي يمكنه التعامل مع الحالة التي يسمح فيها المستخدمون فقط لبعض النطاقات.
كيفية تحديد ما إذا كان تطبيقك يستخدم نطاقات متعدّدة
فحص رمز تطبيقك أو الاتصال الصادر عبر الشبكة لتحديد ما إذا كانت طلبات OAuth 2.0 التي يجريها تطبيقك تؤدي إلى عرض الأذونات بشكل دقيق في الشاشة.
فحص رمز التطبيق
راجِع أقسام رمز التطبيق الذي تُجري فيه الطلبات إلى نقاط نهاية تفويض Google OAuth لطلب الإذن من المستخدمين. إذا كنت تستخدم إحدى مكتبات عملاء Google API، يمكنك غالبًا العثور على النطاقات التي يطلبها تطبيقك في خطوات إعداد البرنامج. في ما يلي بعض الأمثلة. يجب الرجوع إلى مستندات حِزم SDK التي يستخدمها تطبيقك للتعامل مع Google OAuth 2.0 لتحديد ما إذا كان تطبيقك متأثرًا أم لا، وذلك بالاستعانة بالإرشادات الموضّحة في الأمثلة التالية كمرجع.
خدمات هوية Google
يؤدي مقتطف رمز مكتبة JavaScript التالي لخدمات Google Identity Services إلى إعداد TokenClient
باستخدام نطاقات متعددة لا تتيح تسجيل الدخول. سيتم عرض شاشة الموافقة الدقيقة على الأذونات عندما يطلب تطبيق الويب الحصول على إذن من المستخدمين.
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
نطاقَين لا يتضمّنان إمكانية تسجيل الدخول. سيتم عرض شاشة الموافقة الدقيقة على الأذونات عندما يطلب تطبيق الويب الحصول على إذن من المستخدمين.
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: فحص حركة بيانات الشبكة باستخدام Network Inspector (أداة فحص الشبكة)
-
تطبيقات Chrome
- انتقِل إلى صفحة إضافات Chrome.
- ضَع علامة في مربّع الاختيار وضع مطوّر البرامج في أعلى يسار صفحة الإضافات.
- اختيار الإضافة التي تريد مراقبتها
- انقر على رابط صفحة الخلفية في قسم فحص الملفات الشخصية في صفحة الإضافة.
- ستظهر نافذة منبثقة باسم أدوات المطوّرين (Developer Tools) من أجل مساعدتك في رصد حركة بيانات الشبكة في علامة التبويب "الشبكة".
- iOS - تحليل حركة مرور HTTP باستخدام الأدوات
- Universal Windows Platform (UWP): فحص حركة بيانات الشبكة في Visual Studio
- التطبيقات المتوافقة مع أجهزة الكمبيوتر المكتبي: استخدِم أداة التقاط بيانات الشبكة المتاحة لنظام التشغيل الذي تم تطوير التطبيق من أجله.
أثناء فحص طلبات الشبكة، ابحث عن الطلبات التي تم إرسالها إلى نقاط نهاية تفويض Google OAuth وتحقَّق من معلَمة scope
.
وcause هذه القيم إلى عرض شاشة الموافقة على الأذونات الدقيقة.
تحتوي المَعلَمة
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
على أكثر من نطاق واحد لا يتضمّن ميزة "تسجيل الدخول".يحتوي نموذج الطلب التالي على نطاقين لا يتيحان تسجيل الدخول لعرض البيانات الوصفية للمستخدم على 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
أفضل الممارسات للتعامل مع الأذونات الدقيقة
إذا determine أنّ تطبيقك يحتاج إلى تحديث للتعامل مع الأذونات الدقيقة، يجب إجراء التعديلات اللازمة على الرمز للتعامل بشكلٍ صحيح مع الموافقة على النطاقات المتعددة. يجب أن تلتزم جميع الطلبات بأفضل الممارسات التالية:
- مراجعة خدمات 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) لإعادة التوجيه لنقطة النهاية العامة في Credentials page وحدة تحكُّم Google Cloud.
يعرض مقتطف الرمز التالي مثال على NodeJS يطلب نطاقين لا يتضمّنان ميزة تسجيل الدخول. سيرى المستخدمون شاشة الموافقة على الأذونات الدقيقة.
النهج غير الصحيح
الكل أو لا شيء
تتم إعادة توجيه المستخدمين إلى عنوان 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 للتفاعل مع Google OAuth 2.0، عليك مراجعة هذه الوثائق حول التعامل مع الأذونات الدقيقة.
- بالنسبة إلى التطبيقات التي تُجري طلبات بيانات مباشرةً باستخدام JavaScript إلى نقاط نهاية تفويض OAuth 2.0 من Google، عليك مراجعة هذه الوثائق المتعلّقة بالتعامل مع الأذونات الدقيقة.
اختبار تطبيقك المحدّث بشأن التعامل مع الأذونات الدقيقة
- يمكنك وضع Outline لجميع الحالات التي يمكن فيها للمستخدمين الرد على طلبات الأذونات والسلوك المتوقَّع من تطبيقك. على سبيل المثال، إذا كان المستخدم لا يسمح إلا بنطاقَين من أصل ثلاثة نطاقات مطلوبة، من المفترض أن يتصرف تطبيقك وفقًا لذلك.
-
يمكنك اختبار تطبيقك من خلال تفعيل الأذونات الدقيقة. هناك طريقتان لتفعيل
الأذونات الدقيقة:
- تحقَّق من شاشات طلب الموافقة المتعلّقة ببروتوكول OAuth 2.0 في تطبيقك لمعرفة ما إذا كانت الأذونات الدقيقة مفعّلة لتطبيقك أم لا. يمكنك أيضًا إنشاء معرّف عميل جديد لبروتوكول Google OAuth 2.0 على الويب أو لنظام Android أو iOS أو من خلال Google Cloud Console لأغراض الاختبار، لأنّه يتم دائمًا تفعيل الأذونات الدقيقة الخاصة بها.
-
اضبط المَعلمة
enable_granular_consent
علىtrue
عند طلب نقاط نهاية التفويض في Google OAuth. تتوافق بعض حِزم SDK بشكل صريح مع هذه المَعلمة. بالنسبة إلى أنواع أخرى، يمكنك الاطّلاع على المستندات لمعرفة كيفية إضافة هذه المَعلمة وقيمتها يدويًا. إذا كان تنفيذك لا يتيح إضافة المَعلمة، يمكنك إنشاء معرّف عميل Google OAuth 2.0 جديد لنظام التشغيل Android أو iOS أو الويب من خلال وحدة تحكُّم Google Cloud لأغراض الاختبار فقط كما هو مذكور في النقطة السابقة.
- عند اختبار تطبيقك المحدَّث، استخدِم حساب Google شخصيًا (@gmail.com) بدلاً من حساب Workspace. ويرجع ذلك إلى أنّ تطبيقات Workspace Enterprise التي تم إعداد تفويض الوصول إليها على مستوى النطاق أو التي تم وضع علامة موثوق به عليها لن تتأثر في الوقت الحالي بالتغييرات التي تطرأ على الأذونات الدقيقة. بالتالي، قد لا يؤدي إجراء اختبار باستخدام حساب Workspace من مؤسستك إلى عرض الشاشة الجديدة لطلب الموافقة على النحو المطلوب.