كيفية التعامل مع الأذونات الدقيقة

نظرة عامة

من خلال الأذونات الدقيقة، يحصل المستهلكون على عناصر تحكُّم أكثر دقة في بيانات الحساب التي يختارون مشاركتها مع كل تطبيق. وهي تفيد المستخدمين والمطوّرين على حد سواء من خلال توفير قدر أكبر من التحكم والشفافية والأمان. سيساعدك هذا الدليل على فهم التغييرات والخطوات اللازمة لتعديل تطبيقاتك بنجاح من أجل معالجة الأذونات الدقيقة.

ما المقصود بالإذن الدقيق؟

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

عندما يتم طلب أكثر من نطاق واحد لا يتيح تسجيل الدخول

نطاقات تسجيل الدخول ونطاقاتها التي لا تحتوي على تسجيل الدخول

في التطبيقات التي تطلب نطاقات تسجيل الدخول وغير تسجيل الدخول، ستظهر للمستخدمين أولاً صفحة الموافقة لنطاقات تسجيل الدخول (email وprofile وopenid). بعد موافقة المستخدمين على مشاركة معلومات هويتهم الأساسية (الاسم وعنوان البريد الإلكتروني وصورة الملف الشخصي)، ستظهر للمستخدمين شاشة دقيقة للموافقة على الأذونات للنطاقات التي لا تتضمن تسجيل الدخول. في هذه الحالة، يجب أن يتحقّق التطبيق من النطاقات التي يمنحها المستخدمون، ولا يمكنه افتراض أنّ المستخدمين منحوا جميع النطاقات المطلوبة. في المثال التالي، يطلب تطبيق الويب جميع نطاقات "تسجيل الدخول" الثلاثة ونطاق لا يتضمن ميزة "تسجيل الدخول" على Google Drive. بعد موافقة المستخدمين على نطاقات تسجيل الدخول، ستظهر للمستخدمين شاشة الموافقة على الأذونات الدقيقة لإذن Google Drive:

نطاقات تسجيل الدخول ونطاقاتها التي لا تحتوي على تسجيل الدخول

أكثر من نطاق واحد لا يتضمّن تسجيل الدخول

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

أكثر من نطاق واحد لا يتضمّن تسجيل الدخول

بالنسبة إلى التطبيقات التي تطلب فقط نطاقات تسجيل الدخول (email وprofile وopenid)، لا تسري شاشة الموافقة على أذونات #inspect-your-Application-codegranular. ويمكن للمستخدمين الموافقة على طلب تسجيل الدخول بأكمله أو رفضه. بتعبير آخر، إذا كانت التطبيقات لا تطلب سوى نطاقات تسجيل الدخول (واحد أو اثنتين أو الثلاثة جميعًا)، لن تكون شاشة الموافقة الدقيقة على الأذونات منطبقة.

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

عدد نطاقات تسجيل الدخول عدد النطاقات التي لم يتم تسجيل الدخول إليها شاشة الموافقة على الأذونات الدقيقة
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
});

فحص مكالمة الشبكة الصادرة

ستختلف طريقة فحص طلبات الشبكة حسب نوع برنامج التطبيق.

أثناء فحص طلبات الشبكة، ابحث عن الطلبات التي تم إرسالها إلى نقاط نهاية تفويض 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 أنّ تطبيقك يحتاج إلى تحديث للتعامل مع الأذونات الدقيقة، يجب إجراء التعديلات اللازمة على الرمز للتعامل بشكلٍ صحيح مع الموافقة على النطاقات المتعددة. يجب أن تلتزم جميع الطلبات بأفضل الممارسات التالية:

  1. مراجعة خدمات Google API: سياسة بيانات المستخدمين والتأكّد من التزامك بها.
  2. اطلب نطاقات محددة مطلوبة للمهمة. عليك الالتزام بسياسة Google OAuth 2.0 التي لا تطلب سوى النطاقات التي تحتاج إليها. عليك تجنُّب طلب استخدام نطاقات متعددة عند تسجيل الدخول، إلا إذا كان ذلك ضروريًا للوظيفة الأساسية لتطبيقك، لأنّ تجميع نطاقات متعددة معًا، لا سيما للمستخدمين الذين لا يعرفون ميزات تطبيقك لأول مرة، قد يصعب عليهم فهم الحاجة إلى هذه الأذونات. قد يؤدي ذلك إلى إطلاق تنبيهات ومنع المستخدمين من التفاعل مع تطبيقك بشكل أكبر.
  3. قدِّم مبررًا للمستخدمين قبل طلب طلب التفويض. اشرح بوضوح سبب احتياج تطبيقك إلى الإذن المطلوب، وماذا ستفعل ببيانات المستخدم، وكيف سيستفيد المستخدم من الموافقة على الطلب. يشير بحثنا إلى أن هذه التفسيرات تزيد من ثقة المستخدمين وتفاعلهم.
  4. استخدِم التفويض الإضافي عندما يطلب تطبيقك نطاقات معيّنة لتجنّب الاضطرار إلى إدارة رموز دخول متعدّدة.
  5. تحقَّق من النطاقات التي منحها المستخدمون. عند طلب نطاقات متعددة في الوقت نفسه، قد لا يمنح المستخدمون جميع النطاقات التي يطلبها تطبيقك. يجب أن يتحقّق تطبيقك دائمًا من النطاقات التي منحها المستخدم، وأن يتعامل مع أي رفض للنطاقات من خلال إيقاف الميزات ذات الصلة. اتّبِع سياسات 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 وتحديث التطبيق لمعالجة الأذونات الدقيقة بناءً على أفضل الممارسات.

الوصول من جهة الخادم (بلا إنترنت)

يتطلب منك وضع الوصول من جهة الخادم (بلا إنترنت) تنفيذ ما يلي:

يعرض مقتطف الرمز التالي مثال على 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، عليك مراجعة هذه الوثائق المتعلّقة بالتعامل مع الأذونات الدقيقة.

اختبار تطبيقك المحدّث بشأن التعامل مع الأذونات الدقيقة

  1. يمكنك وضع Outline لجميع الحالات التي يمكن فيها للمستخدمين الرد على طلبات الأذونات والسلوك المتوقَّع من تطبيقك. على سبيل المثال، إذا كان المستخدم لا يسمح إلا بنطاقَين من أصل ثلاثة نطاقات مطلوبة، من المفترض أن يتصرف تطبيقك وفقًا لذلك.
  2. يمكنك اختبار تطبيقك من خلال تفعيل الأذونات الدقيقة. هناك طريقتان لتفعيل الأذونات الدقيقة:
    1. تحقَّق من شاشات طلب الموافقة المتعلّقة ببروتوكول OAuth 2.0 في تطبيقك لمعرفة ما إذا كانت الأذونات الدقيقة مفعّلة لتطبيقك أم لا. يمكنك أيضًا إنشاء معرّف عميل جديد لبروتوكول Google OAuth 2.0 على الويب أو لنظام Android أو iOS أو من خلال Google Cloud Console لأغراض الاختبار، لأنّه يتم دائمًا تفعيل الأذونات الدقيقة الخاصة بها.
    2. اضبط المَعلمة enable_granular_consent على true عند طلب نقاط نهاية التفويض في Google OAuth. تتوافق بعض حِزم SDK بشكل صريح مع هذه المَعلمة. بالنسبة إلى أنواع أخرى، يمكنك الاطّلاع على المستندات لمعرفة كيفية إضافة هذه المَعلمة وقيمتها يدويًا. إذا كان تنفيذك لا يتيح إضافة المَعلمة، يمكنك إنشاء معرّف عميل Google OAuth 2.0 جديد لنظام التشغيل Android أو iOS أو الويب من خلال وحدة تحكُّم Google Cloud لأغراض الاختبار فقط كما هو مذكور في النقطة السابقة.