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

نظرة عامة

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

ما هو الإذن الدقيق؟

تخيل أنك تطوّر تطبيقًا للإنتاجية يطلب كلاً من نطاقي البريد الإلكتروني والتقويم. المستخدمون استخدام التطبيق مع تقويم 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+ سارٍ

تحديد ما إذا كانت تطبيقاتك ستتأثر أو لا

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

كيفية تحديد ما إذا كان تطبيقك يستخدم نطاقات متعددة

افحص رمز التطبيق أو مكالمة شبكة صادرة لتحديد ما إذا كانت OAuth 2.0 ستؤدي طلبات التفويض التي يرسلها تطبيقك إلى ظهور شاشة الموافقة الدقيقة على الأذونات. الذي سيتم عرضه.

فحص رمز التطبيق

مراجعة أقسام رمز التطبيق التي تُجري فيها مكالمات إلى Google OAuth نقاط نهاية التفويض لطلب الإذن من المستخدمين. في حال استخدام إحدى واجهات برمجة تطبيقات Google مكتبات العملاء، يمكنك غالبًا العثور على النطاقات التي يطلبها تطبيقك في خطوات التهيئة. يمكنك الاطّلاع على بعض الأمثلة في القسم التالي. يجب الرجوع إلى مستندات حِزم تطوير البرامج (SDK) التي يستخدمها تطبيقك للتعامل مع Google OAuth 2.0 لتحديد ما إذا كان تطبيقك متأثرًا، مع استخدام الإرشادات الموضّحة في الأمثلة التالية كمرجع .

خدمات Google Identity

خدمات Google Identity التالية يعمل مقتطف رمز مكتبة JavaScript على إعداد 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.

تتسبب هذه القيم في عرض شاشة الموافقة على الأذونات الدقيقة.

  • تحتوي المَعلمة 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

أفضل الممارسات لمعالجة الأذونات الدقيقة

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

  1. مراجعة خدمات Google API: سياسة بيانات المستخدمين واحرص على الالتزام بها.
  2. طلب النطاقات المحددة اللازمة للمهمة. إِنْتَ الالتزام بسياسة Google OAuth 2.0 التي لا تطلب سوى النطاقات التي الحاجة. ينبغي أن تتجنب طلب عدة النطاقات عند تسجيل الدخول، ما لم تكن ضرورية للوظيفة الأساسية لتطبيقك. التجميع ونطاقات متعددة معًا، خاصةً للمستخدمين لأول مرة الذين ليسوا على دراية ميزات التطبيق، يمكن أن يجعل من الصعب عليهم فهم الحاجة إلى هذه الأذونات. وقد يؤدي ذلك إلى إطلاق إنذارات ومنع المستخدمين من التفاعل بشكل أكبر مع تطبيقك.
  3. تقديم المبرر للمستخدمين قبل طلب طلب تفويض. اشرح بوضوح سبب احتياج تطبيقك إلى الإذن المطلوب. ماذا ستفعل ببيانات المستخدم، وكيف سيستفيد المستخدم من الموافقة على الطلب. تشير أبحاثنا إلى أن هذه التفسيرات تزيد من ثقة المستخدم وتفاعله.
  4. الاستخدام اعتماد متزايد كلما طلب تطبيقك نطاقات لتجنب الاضطرار إلى إدارة رموز دخول متعددة.
  5. تحقَّق من النطاقات التي منحها المستخدمون. عند طلب عدة عناصر النطاقات في آنٍ واحد، قد لا يمنح المستخدمون جميع النطاقات التي يطلبها تطبيقك. من المفترض أن يُدرج تطبيقك دائمًا التحقّق من النطاقات التي منحها المستخدم والتعامل مع أي عمليات رفض للنطاقات عن طريق إيقاف النطاقات ذات الصلة الجديدة. اتّباع سياسات Google OAuth 2.0 على التعامل مع طلبات الموافقة لعدّة مستخدمين والنطاقات وتطلب من المستخدم الموافقة مرة أخرى فقط بعد أن يشير بوضوح إلى النية في استخدام الميزة المحددة التي تتطلب النطاق.

يجب تحديث تطبيقك لمعالجة الأذونات الدقيقة

تطبيقات Android

يجب الاطّلاع على مستندات حِزم تطوير البرامج (SDK) التي تستخدمها للتفاعل مع Google OAuth 2.0 تحديث تطبيقك للتعامل مع الأذونات الدقيقة استنادًا إلى أفضل الممارسات.

في حال استخدام auth.api.signin حزمة SDK من خدمات 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 من التطبيقات المستندة إلى الخادم.

الوصول من جهة العميل فقط

  • بالنسبة إلى التطبيقات التي تستخدم خدمات هوية Google للتفاعل مع Google OAuth 2.0، يجب مراجعة هذا. المستندات على التعامل مع الأذونات الدقيقة
  • بالنسبة إلى التطبيقات التي تُجري مكالمات مباشرةً باستخدام JavaScript لتفويض Google OAuth 2.0 نقاط النهاية، فيجب مراجعة هذا المستندات على التعامل مع الأذونات الدقيقة

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

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