نظرة عامة
من خلال الأذونات الدقيقة، يحصل المستهلكون على تحكّم أكثر دقة في بيانات الحساب التي يختارون مشاركتها مع كل تطبيق. وتفيد هذه الأذونات كلاً من المستخدمين والمطوّرين من خلال توفير قدر أكبر من التحكّم والشفافية والأمان. سيساعدك هذا الدليل في فهم التغييرات والخطوات اللازمة لتعديل تطبيقاتك بنجاح من أجل التعامل مع الأذونات الدقيقة.
ما هو الإذن الدقيق؟
لنفترض أنّك تطوّر تطبيق إنتاجية يطلب الوصول إلى نطاقات البريد الإلكتروني والتقويم. قد يريد المستخدمون استخدام تطبيقك في "تقويم Google" فقط، وليس في Gmail. باستخدام أذونات OAuth الدقيقة، يمكن للمستخدمين اختيار منح إذن الوصول إلى "تقويم Google" فقط وليس Gmail. من خلال السماح للمستخدمين بمنح إذن الوصول إلى بيانات محدّدة، يقلّل ذلك من تعرُّض البيانات للخطر، ويعزّز الثقة، ويمنح المستخدمين إمكانية التحكّم في حياتهم الرقمية مع التركيز على الخصوصية. من المهم تصميم تطبيقك للتعامل مع هذه السيناريوهات.
عند طلب أكثر من نطاق واحد غير مخصّص لتسجيل الدخول
نطاقات تسجيل الدخول وغير تسجيل الدخول
بالنسبة إلى التطبيقات التي تطلب كلاً من نطاقات تسجيل الدخول وغير تسجيل الدخول، تظهر للمستخدمين أولاً صفحة طلب الموافقة على نطاقات تسجيل الدخول (email وprofile وopenid). بعد موافقة المستخدمين على مشاركة معلومات الهوية الأساسية (الاسم وعنوان البريد الإلكتروني وصورة الملف الشخصي)، ستظهر لهم شاشة طلب الموافقة على الأذونات الدقيقة لنطاقات غير تسجيل الدخول. في هذه الحالة، يجب أن يتحقّق التطبيق من النطاقات التي يمنحها المستخدمون، ولا يمكنه افتراض أنّ المستخدمين يمنحون جميع النطاقات المطلوبة. في المثال التالي، يطلب تطبيق الويب جميع نطاقات "تسجيل الدخول" الثلاثة ونطاق "عدم تسجيل الدخول" في Google Drive. بعد موافقة المستخدمين على نطاقات تسجيل الدخول، ستظهر لهم شاشة طلب الموافقة على الأذونات الدقيقة لإذن Google Drive:
أكثر من نطاق واحد غير مخصّص لتسجيل الدخول
ستظهر للمستخدمين شاشة طلب الموافقة على الأذونات الدقيقة عندما تطلب التطبيقات أكثر من نطاق واحد غير مخصّص لتسجيل الدخول. ويمكن للمستخدمين اختيار الأذونات التي يريدون الموافقة عليها لمشاركتها مع التطبيق. في ما يلي مثال على شاشة طلب الموافقة على الأذونات الدقيقة التي تطلب الوصول إلى رسائل 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 الرمز 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 earlier. * 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على أكثر من نطاق واحد غير مخصّص لتسجيل الدخول.يحتوي نموذج الطلب التالي على نطاقَين غير مخصّصَين لتسجيل الدخول لعرض البيانات الوصفية في 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 Console.
يوضّح مقتطف الرمز التالي مثالاً على 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 earlier
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 the Google authorization server.
if (req.url == '/') {
res.writeHead(301, { "Location": authorizationUrl });
}
// Receive the callback from the Google authorization server.
if (req.url.startsWith('/oauth2callback')) {
// Handle the Google authorization 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 earlier
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 the Google authorization server.
if (req.url == '/') {
res.writeHead(301, { "Location": authorizationUrl });
}
// Receive the callback from the Google authorization server.
if (req.url.startsWith('/oauth2callback')) {
// Handle the Google authorization 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 إلى نقاط نهاية التفويض في Google OAuth 2.0، عليك مراجعة هذه المستندات حول التعامل مع الأذونات الدقيقة.
اختبار تطبيقك المحدَّث بشأن معالجة الأذونات الدقيقة
- حدِّد جميع الحالات التي يمكن للمستخدمين فيها الردّ على طلبات الحصول على الأذونات والسلوك المتوقّع من تطبيقك. على سبيل المثال، إذا سمح المستخدم بنطاقَين فقط من بين ثلاثة نطاقات مطلوبة، يجب أن يتصرّف تطبيقك وفقًا لذلك.
اختبِر تطبيقك بعد تفعيل الإذن الدقيق. هناك طريقتان لتفعيل الأذونات الدقيقة:
- يُرجى التحقّق من شاشات طلب الموافقة 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 Console لأغراض الاختبار فقط كما هو موضّح في النقطة السابقة.
عند اختبار تطبيقك المحدَّث، استخدِم حساب Google شخصيًا (@gmail.com) بدلاً من حساب Workspace. ويعود السبب في ذلك إلى أنّ تطبيقات Workspace Enterprise التي تستخدم ميزة التفويض على مستوى النطاق أو التي تم وضع علامة موثوق بها عليها لا تتأثر بالتغييرات التي تطرأ على الأذونات الدقيقة في الوقت الحالي. لذلك، قد لا يؤدي الاختبار باستخدام حساب Workspace من مؤسستك إلى عرض شاشة طلب الموافقة الدقيقة الجديدة على النحو المطلوب.