استخدام OAuth 2.0 لتطبيقات خادم الويب

يوضّح هذا المستند كيف تستخدم تطبيقات خادم الويب مكتبات عملاء Google API أو نقاط نهاية Google OAuth 2.0 لتنفيذ تفويض OAuth 2.0 من أجل الوصول إلى YouTube Data API.

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

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

تستخدم تطبيقات خادم الويب أيضًا حسابات الخدمة بشكل متكرر لتفويض طلبات البيانات من واجهة برمجة التطبيقات، خاصةً عند استدعاء واجهات Cloud API للوصول إلى البيانات المستندة إلى المشاريع بدلاً من البيانات الخاصة بالمستخدمين. يمكن لتطبيقات خادم الويب استخدام حسابات الخدمة مع تفويض المستخدم. يُرجى العِلم أنّ YouTube Data API لا يتيح استخدام مسار حساب الخدمة إلا لمالكي المحتوى في YouTube الذين يملكون قنوات متعدّدة على YouTube ويديرونها. على وجه التحديد، يمكن لمالكي المحتوى استخدام حسابات الخدمة لاستدعاء طرق واجهة برمجة التطبيقات التي تتوافق مع مَعلمة الطلب onBehalfOfContentOwner.

مكتبات العملاء

تستخدم الأمثلة الخاصة باللغة الواردة في هذه الصفحة مكتبات عميل Google API لتنفيذ تفويض OAuth 2.0. لتشغيل نماذج الرموز البرمجية، عليك أولاً تثبيت مكتبة البرامج الخاصة بلغة البرمجة التي تستخدمها.

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

تتوفّر مكتبات عملاء Google API للتطبيقات من جهة الخادم باللغات التالية:

المتطلبات الأساسية

تفعيل واجهات برمجة التطبيقات لمشروعك

يجب تفعيل أي واجهات برمجة تطبيقات تستدعي Google APIs في API Console.

لتفعيل واجهة برمجة تطبيقات لمشروعك، اتّبِع الخطوات التالية:

  1. افتح مكتبة API في Google API Console.
  2. اختَر مشروعًا أو أنشئ مشروعًا جديدًا إذا طُلب منك ذلك.
  3. استخدِم صفحة المكتبة للعثور على YouTube Data API وتفعيله. ابحث عن أي واجهات برمجة تطبيقات أخرى سيستخدمها تطبيقك وفعِّلها أيضًا.

إنشاء بيانات اعتماد التفويض

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

  1. انتقِل إلى صفحة العملاء.
  2. انقر على إنشاء عميل.
  3. اختَر نوع التطبيق تطبيق الويب.
  4. املأ النموذج وانقر على إنشاء. يجب أن تحدّد التطبيقات التي تستخدم لغات وأُطر عمل مثل PHP وJava وPython وRuby و‎ .NET معرّفات موارد منتظمة (URI) لإعادة التوجيه معتمَدة. معرّفات الموارد المنتظمة (URI) لإعادة التوجيه هي نقاط النهاية التي يمكن لخادم OAuth 2.0 إرسال الردود إليها. يجب أن تلتزم نقاط النهاية هذه بقواعد التحقّق من الصحة في Google.

    للاختبار، يمكنك تحديد معرّفات URI تشير إلى الجهاز المحلي، مثل http://localhost:8080. تستخدم جميع الأمثلة الواردة في هذا المستند http://localhost:8080 كمعرّف موارد منتظم (URI) لإعادة التوجيه.

    ننصحك بتصميم نقاط نهاية المصادقة في تطبيقك بطريقة تضمن عدم عرض تطبيقك لرموز التفويض لموارد أخرى على الصفحة.

بعد إنشاء بيانات الاعتماد، نزِّل ملف client_secret.json من API Console. احفظ الملف بأمان في مكان لا يمكن لتطبيقك وحده الوصول إليه.

تحديد نطاقات الوصول

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

قبل البدء في تنفيذ عملية تفويض OAuth 2.0، ننصحك بتحديد النطاقات التي سيحتاج تطبيقك إلى إذن للوصول إليها.

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

يستخدم الإصدار 3 من YouTube Data API النطاقات التالية:

النطاق الوصف
https://www.googleapis.com/auth/youtube إدارة حسابك في YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creator الاطّلاع على قائمة بأعضاء القناة النشطين حاليًا ومستواهم الحالي وتاريخ انضمامهم
https://www.googleapis.com/auth/youtube.force-ssl الاطّلاع على فيديوهاتك على YouTube وتقييماتها وتعليقاتها وترجماتها وكذلك تعديلها وحذفها نهائيًا
https://www.googleapis.com/auth/youtube.readonly عرض حسابك في YouTube
https://www.googleapis.com/auth/youtube.upload إدارة فيديوهات YouTube
https://www.googleapis.com/auth/youtubepartner عرض وإدارة أصولك والمحتوى المرتبط بها على YouTube
https://www.googleapis.com/auth/youtubepartner-channel-audit عرض معلومات خاصة عن قناتك على YouTube ذات صلة أثناء عملية تدقيق شريك YouTube

يحتوي مستند نطاقات واجهة برمجة التطبيقات OAuth 2.0 على قائمة كاملة بالنطاقات التي يمكنك استخدامها للوصول إلى Google APIs.

المتطلبات الخاصة باللغة

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

PHP

لتشغيل نماذج رمز PHP في هذا المستند، ستحتاج إلى ما يلي:

  • الإصدار 8.0 من PHP أو إصدار أحدث مع تثبيت واجهة سطر الأوامر (CLI) وإضافة JSON
  • أداة إدارة التبعية Composer
  • مكتبة برامج Google APIs للغة PHP:

    composer require google/apiclient:^2.15.0

لمزيد من المعلومات، يمكنك الاطّلاع على مكتبة برامج Google APIs للغة PHP.

Python

لتشغيل نماذج رموز Python البرمجية في هذا المستند، ستحتاج إلى ما يلي:

  • الإصدار 3.7 أو الإصدارات الأحدث من Python
  • أداة إدارة الحِزم pip
  • إصدار 2.0 من Google APIs Client Library للغة Python:
    pip install --upgrade google-api-python-client
  • google-auth وgoogle-auth-oauthlib وgoogle-auth-httplib2 لتفويض المستخدم.
    pip install --upgrade google-auth google-auth-oauthlib google-auth-httplib2
  • إطار عمل تطبيق الويب Flask Python
    pip install --upgrade flask
  • مكتبة HTTP التي تتضمّن العنصر requests
    pip install --upgrade requests

راجِع ملاحظات الإصدار الخاصة بمكتبة برامج Google API Python إذا لم تتمكّن من ترقية Python ودليل النقل المرتبط بها.

Ruby

لتشغيل نماذج رموز Ruby البرمجية في هذا المستند، ستحتاج إلى:

  • الإصدار 2.6 من Ruby أو إصدار أحدث
  • مكتبة Google Auth للغة Ruby:

    gem install googleauth
  • إطار عمل تطبيق الويب Sinatra Ruby

    gem install sinatra

Node.js

لتنفيذ عيّنات رمز Node.js في هذا المستند، ستحتاج إلى:

  • إصدار الصيانة للدعم طويل الأمد (LTS) أو الإصدار النشط للدعم طويل الأمد (LTS) أو الإصدار الحالي من Node.js.
  • عميل Google APIs Node.js:

    npm install googleapis crypto express express-session

HTTP/REST

لست بحاجة إلى تثبيت أي مكتبات لتتمكّن من طلب نقاط نهاية OAuth 2.0 مباشرةً.

الحصول على رموز الدخول عبر OAuth 2.0

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

تقدّم القائمة التالية ملخّصًا سريعًا لهذه الخطوات:

  1. يحدّد تطبيقك الأذونات التي يحتاج إليها.
  2. يعيد تطبيقك توجيه المستخدم إلى Google مع قائمة الأذونات المطلوبة.
  3. يقرّر المستخدم ما إذا كان سيمنح الأذونات لتطبيقك.
  4. يتعرّف تطبيقك على القرار الذي اتخذه المستخدم.
  5. إذا منح المستخدم الأذونات المطلوبة، يسترد تطبيقك الرموز المميزة اللازمة لإجراء طلبات إلى واجهة برمجة التطبيقات نيابةً عن المستخدم.

الخطوة 1: ضبط مَعلمات التفويض

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

  • إذا كنت تستخدم مكتبة عميل من Google للمصادقة والتفويض باستخدام OAuth 2.0، عليك إنشاء عنصر وتعديله لتحديد هذه المَعلمات.
  • إذا طلبت نقطة نهاية Google OAuth 2.0 مباشرةً، سيتم إنشاء عنوان URL وتحديد المَعلمات في عنوان URL هذا.

تحدّد علامات التبويب التالية مَعلمات التفويض المتوافقة مع تطبيقات خادم الويب. توضّح الأمثلة الخاصة باللغة أيضًا كيفية استخدام مكتبة عميل أو مكتبة أذونات لإعداد عنصر يضبط هذه المَعلمات:

PHP

ينشئ مقتطف الرمز البرمجي التالي عنصر Google\Client()، الذي يحدّد المَعلمات في طلب التفويض.

يستخدم هذا العنصر معلومات من ملف client_secret.json لتحديد تطبيقك. (يمكنك الاطّلاع على إنشاء بيانات اعتماد التفويض للحصول على مزيد من المعلومات حول هذا الملف). يحدّد العنصر أيضًا النطاقات التي يطلب تطبيقك الإذن بالوصول إليها وعنوان URL لنقطة نهاية المصادقة في تطبيقك، والتي ستتعامل مع الردّ من خادم OAuth 2.0 من Google. أخيرًا، يضبط الرمز المَعلمتَين الاختياريتَين access_type وinclude_granted_scopes.

على سبيل المثال، يطلب هذا الرمز البرمجي إذن الوصول بلا إنترنت لإدارة حساب مستخدم على YouTube:

use Google\Client;

$client = new Client();

// Required, call the setAuthConfig function to load authorization credentials from
// client_secret.json file.
$client->setAuthConfig('client_secret.json');

// Required, to set the scope value, call the addScope function
$client->addScope(GOOGLE_SERVICE_YOUTUBE::YOUTUBE_FORCE_SSL);

// Required, call the setRedirectUri function to specify a valid redirect URI for the
// provided client_id
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php');

// Recommended, offline access will give you both an access and refresh token so that
// your app can refresh the access token without user interaction.
$client->setAccessType('offline');

// Recommended, call the setState function. Using a state value can increase your assurance that
// an incoming connection is the result of an authentication request.
$client->setState($sample_passthrough_value);

// Optional, if your application knows which user is trying to authenticate, it can use this
// parameter to provide a hint to the Google Authentication Server.
$client->setLoginHint('hint@example.com');

// Optional, call the setPrompt function to set "consent" will prompt the user for consent
$client->setPrompt('consent');

// Optional, call the setIncludeGrantedScopes function with true to enable incremental
// authorization
$client->setIncludeGrantedScopes(true);

Python

يستخدم مقتطف الرمز التالي الوحدة google-auth-oauthlib.flow لإنشاء طلب التفويض.

تنشئ الشفرة عنصر Flow، الذي يحدّد تطبيقك باستخدام معلومات من ملف client_secret.json الذي نزّلته بعد إنشاء بيانات اعتماد التفويض. يحدّد هذا العنصر أيضًا النطاقات التي يطلب تطبيقك الإذن بالوصول إليها وعنوان URL لنقطة نهاية المصادقة في تطبيقك، والتي ستتعامل مع الردّ من خادم OAuth 2.0 من Google. أخيرًا، يضبط الرمز المَعلمتَين الاختياريتَين access_type وinclude_granted_scopes.

على سبيل المثال، يطلب هذا الرمز البرمجي إذن الوصول بلا إنترنت لإدارة حساب مستخدم على YouTube:

import google.oauth2.credentials
import google_auth_oauthlib.flow

# Required, call the from_client_secrets_file method to retrieve the client ID from a
# client_secret.json file. The client ID (from that file) and access scopes are required. (You can
# also use the from_client_config method, which passes the client configuration as it originally
# appeared in a client secrets file but doesn't access the file itself.)
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file('client_secret.json',
    scopes=['https://www.googleapis.com/auth/youtube.force-ssl'])

# Required, indicate where the API server will redirect the user after the user completes
# the authorization flow. The redirect URI is required. The value must exactly
# match one of the authorized redirect URIs for the OAuth 2.0 client, which you
# configured in the API Console. If this value doesn't match an authorized URI,
# you will get a 'redirect_uri_mismatch' error.
flow.redirect_uri = 'https://www.example.com/oauth2callback'

# Generate URL for request to Google's OAuth 2.0 server.
# Use kwargs to set optional request parameters.
authorization_url, state = flow.authorization_url(
    # Recommended, enable offline access so that you can refresh an access token without
    # re-prompting the user for permission. Recommended for web server apps.
    access_type='offline',
    # Optional, enable incremental authorization. Recommended as a best practice.
    include_granted_scopes='true',
    # Optional, if your application knows which user is trying to authenticate, it can use this
    # parameter to provide a hint to the Google Authentication Server.
    login_hint='hint@example.com',
    # Optional, set prompt to 'consent' will prompt the user for consent
    prompt='consent')

Ruby

استخدِم ملف client_secrets.json الذي أنشأته لإعداد عنصر عميل في تطبيقك. عند ضبط عنصر العميل، عليك تحديد النطاقات التي يحتاج تطبيقك إلى الوصول إليها، بالإضافة إلى عنوان URL لنقطة نهاية المصادقة في تطبيقك، والتي ستتعامل مع الردّ من خادم OAuth 2.0.

على سبيل المثال، يطلب هذا الرمز البرمجي إذن الوصول بلا إنترنت لإدارة حساب مستخدم على YouTube:

require 'googleauth'
require 'googleauth/web_user_authorizer'
require 'googleauth/stores/redis_token_store'

require 'google/apis/youtube_v3'

# Required, call the from_file method to retrieve the client ID from a
# client_secret.json file.
client_id = Google::Auth::ClientId.from_file('/path/to/client_secret.json')

# Required, scope value 
scope = 'https://www.googleapis.com/auth/youtube.force-ssl'

# Required, Authorizers require a storage instance to manage long term persistence of
# access and refresh tokens.
token_store = Google::Auth::Stores::RedisTokenStore.new(redis: Redis.new)

# Required, indicate where the API server will redirect the user after the user completes
# the authorization flow. The redirect URI is required. The value must exactly
# match one of the authorized redirect URIs for the OAuth 2.0 client, which you
# configured in the API Console. If this value doesn't match an authorized URI,
# you will get a 'redirect_uri_mismatch' error.
callback_uri = '/oauth2callback'

# 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.
authorizer = Google::Auth::WebUserAuthorizer.new(client_id, scope,
                                                token_store, callback_uri)

يستخدم تطبيقك عنصر العميل لتنفيذ عمليات OAuth 2.0، مثل إنشاء عناوين URL لطلبات التفويض وتطبيق رموز الدخول على طلبات HTTP.

Node.js

ينشئ مقتطف الرمز البرمجي التالي عنصر google.auth.OAuth2، الذي يحدّد المَعلمات في طلب التفويض.

يستخدم هذا العنصر معلومات من ملف client_secret.json لتحديد تطبيقك. لطلب أذونات من مستخدم لاسترداد رمز دخول، عليك إعادة توجيهه إلى صفحة موافقة. لإنشاء عنوان URL لصفحة الموافقة، اتّبِع الخطوات التالية:

const {google} = require('googleapis');
const crypto = require('crypto');
const express = require('express');
const session = require('express-session');

/**
 * 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 YouTube API
const scopes = [
  'https://www.googleapis.com/auth/youtube.force-ssl'
];

// Generate a secure random state value.
const state = crypto.randomBytes(32).toString('hex');

// Store state in the session
req.session.state = state;

// Generate a url that asks permissions for the Drive activity and Google Calendar scope
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 a best practice.
  include_granted_scopes: true,
  // Include the state parameter to reduce the risk of CSRF attacks.
  state: state
});

ملاحظة مهمة - لا يتم عرض refresh_token إلا عند إجراء عملية التفويض الأولى. يمكنك الاطّلاع على مزيد من التفاصيل هنا.

HTTP/REST

تتوفّر نقطة نهاية OAuth 2.0 من Google على https://accounts.google.com/o/oauth2/v2/auth. لا يمكن الوصول إلى نقطة النهاية هذه إلا عبر HTTPS. يتم رفض اتصالات HTTP العادية.

يتيح خادم التفويض من Google استخدام مَعلمات سلسلة طلب البحث التالية لتطبيقات خادم الويب:

المعلمات
client_id مطلوب

معرّف العميل لتطبيقك يمكنك العثور على هذه القيمة في Cloud Console صفحة العملاء.

redirect_uri مطلوب

تحدِّد هذه السمة المكان الذي يعيد خادم واجهة برمجة التطبيقات توجيه المستخدم إليه بعد إكماله عملية التفويض. يجب أن تتطابق القيمة تمامًا مع أحد معرّفات الموارد المنتظمة (URI) المصرّح بها لإعادة التوجيه الخاصة بعميل OAuth 2.0 الذي أعددته في صفحة العملاء في Cloud Console الخاصة بعميلك. إذا لم تتطابق هذه القيمة مع معرّف الموارد المنتظم (URI) لإعادة التوجيه المصرّح به والمقدَّم client_id، سيظهر لك الخطأ redirect_uri_mismatch.

يُرجى العِلم أنّه يجب أن يتطابق المخطط http أو https مع حالة الأحرف والشرطة المائلة الأخيرة ("/").

response_type مطلوب

تحدِّد هذه السمة ما إذا كانت نقطة نهاية Google OAuth 2.0 تعرض رمز تفويض.

اضبط قيمة المَعلمة على code لتطبيقات خادم الويب.

scope مطلوب

قائمة مفصولة بمسافات تتضمّن النطاقات التي تحدّد الموارد التي يمكن لتطبيقك الوصول إليها نيابةً عن المستخدم. تُعلم هذه القيم شاشة طلب الموافقة التي يعرضها Google للمستخدم.

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

يستخدم الإصدار 3 من YouTube Data API النطاقات التالية:

النطاق الوصف
https://www.googleapis.com/auth/youtube إدارة حسابك في YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creator الاطّلاع على قائمة بأعضاء القناة النشطين حاليًا ومستواهم الحالي وتاريخ انضمامهم
https://www.googleapis.com/auth/youtube.force-ssl الاطّلاع على فيديوهاتك على YouTube وتقييماتها وتعليقاتها وترجماتها وكذلك تعديلها وحذفها نهائيًا
https://www.googleapis.com/auth/youtube.readonly عرض حسابك في YouTube
https://www.googleapis.com/auth/youtube.upload إدارة فيديوهات YouTube
https://www.googleapis.com/auth/youtubepartner عرض وإدارة أصولك والمحتوى المرتبط بها على YouTube
https://www.googleapis.com/auth/youtubepartner-channel-audit عرض معلومات خاصة عن قناتك على YouTube ذات صلة أثناء عملية تدقيق شريك YouTube

يوفّر مستند نطاقات واجهة برمجة التطبيقات OAuth 2.0 قائمة كاملة بالنطاقات التي يمكنك استخدامها للوصول إلى Google APIs.

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

access_type مقترَح

يشير إلى ما إذا كان بإمكان تطبيقك إعادة تحميل رموز الدخول المميزة عندما لا يكون المستخدم متواجدًا على المتصفّح. قيم المَعلمات الصالحة هي online، وهي القيمة التلقائية، وoffline.

اضبط القيمة على offline إذا كان تطبيقك بحاجة إلى إعادة تحميل رموز الدخول المميزة عندما لا يكون المستخدم متوفّرًا على المتصفّح. هذه هي طريقة إعادة تحميل رموز الدخول المميزة الموضّحة لاحقًا في هذا المستند. تُعلِم هذه القيمة خادم تفويض Google بإرجاع رمز مميّز لإعادة التحميل ورمز دخول في المرة الأولى التي يستبدل فيها تطبيقك رمز تفويض برموز مميّزة.

state مقترَح

تحدّد هذه السمة أي قيمة سلسلة يستخدمها تطبيقك للحفاظ على الحالة بين طلب التفويض واستجابة خادم التفويض. يعرض الخادم القيمة الدقيقة التي ترسلها كزوج name=value في مكوّن طلب البحث الخاص بعنوان URL (?) ضمن redirect_uri بعد أن يوافق المستخدم على طلب الوصول الذي يقدّمه تطبيقك أو يرفضه.

يمكنك استخدام هذه المَعلمة لعدّة أغراض، مثل توجيه المستخدم إلى المرجع الصحيح في تطبيقك، وإرسال أرقام عشوائية، والحدّ من تزوير الطلبات من مواقع إلكترونية مختلفة. بما أنّه يمكن تخمين redirect_uri، فإنّ استخدام قيمة state يمكن أن يزيد من تأكّدك من أنّ الاتصال الوارد هو نتيجة لطلب مصادقة. إذا أنشأت سلسلة عشوائية أو ترميزًا لتجزئة ملف تعريف ارتباط أو قيمة أخرى تسجّل حالة العميل، يمكنك التحقّق من صحة الردّ لضمان أنّ الطلب والردّ نشآ في المتصفّح نفسه، ما يوفّر الحماية من الهجمات، مثل طلب من موقع إلكتروني مختلف لتزوير الطلبات. راجِع مستندات OpenID Connect للاطّلاع على مثال حول كيفية إنشاء رمز مميّز من النوع state وتأكيده.

include_granted_scopes اختياريّ

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

login_hint اختياريّ

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

اضبط قيمة المَعلمة على عنوان بريد إلكتروني أو معرّف sub، وهو يساوي معرّف المستخدم على Google.

prompt اختياريّ

قائمة حساسة لحالة الأحرف ومفصولة بمسافات تتضمّن الطلبات التي سيتم عرضها للمستخدم في حال عدم تحديد هذه المَعلمة، سيُطلب من المستخدم منح الإذن في المرة الأولى فقط التي يطلب فيها مشروعك الوصول إلى البيانات. لمزيد من المعلومات، اطّلِع على طلب إعادة الموافقة.

القيم المحتملة هي:

none عدم عرض أي شاشات مصادقة أو موافقة يجب عدم تحديدها مع قيم أخرى.
consent يجب أن تطلب من المستخدم الموافقة.
select_account مطالبة المستخدم باختيار حساب

الخطوة 2: إعادة التوجيه إلى خادم OAuth 2.0 من Google

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

PHP

  1. إنشاء عنوان URL لطلب الوصول من خادم OAuth 2.0 من Google:
    $auth_url = $client->createAuthUrl();
  2. إعادة توجيه المستخدم إلى $auth_url:
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));

Python

يوضّح هذا المثال كيفية إعادة توجيه المستخدم إلى عنوان URL الخاص بالتفويض باستخدام إطار عمل تطبيق الويب Flask:

return flask.redirect(authorization_url)

Ruby

  1. إنشاء عنوان URL لطلب الوصول من خادم OAuth 2.0 من Google:
    auth_uri = authorizer.get_authorization_url(request: request)
  2. إعادة توجيه المستخدم إلى auth_uri

Node.js

  1. استخدِم عنوان URL الذي تم إنشاؤه authorizationUrl من طريقة الخطوة 1 generateAuthUrl لطلب الوصول من خادم OAuth 2.0 التابع لـ Google.
  2. إعادة توجيه المستخدم إلى authorizationUrl
    res.redirect(authorizationUrl);

HTTP/REST

مثال على إعادة التوجيه إلى خادم التفويض في Google

يطلب نموذج عنوان URL أدناه إذن الوصول بلا إنترنت (access_type=offline) إلى نطاق يسمح بالوصول إلى حساب المستخدم على YouTube وعرضه. يستخدم هذا النوع من الرموز التفويض المتزايد لضمان أن يغطي رمز الدخول الجديد أي نطاقات سبق أن منح المستخدم التطبيق إذن الوصول إليها. يحدّد عنوان URL أيضًا قيمًا للمعلمات المطلوبة redirect_uri وresponse_type وclient_id، بالإضافة إلى المعلمة state. يحتوي عنوان URL على فواصل أسطر ومسافات لتسهيل قراءته.

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 access_type=offline&
 include_granted_scopes=true&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
 response_type=code&
 client_id=client_id

بعد إنشاء عنوان URL للطلب، أعِد توجيه المستخدم إليه.

يصادق خادم OAuth 2.0 من Google على المستخدم ويحصل على موافقته على أن يصل تطبيقك إلى النطاقات المطلوبة. يتم إرسال الردّ إلى تطبيقك باستخدام عنوان URL لإعادة التوجيه الذي حدّدته.

الخطوة 3: تطلب Google من المستخدم الموافقة

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

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

الأخطاء

قد تعرض الطلبات المُرسَلة إلى نقطة نهاية تفويض OAuth 2.0 من Google رسائل خطأ موجّهة إلى المستخدمين بدلاً من عمليات المصادقة والتفويض المتوقّعة. في ما يلي رموز الخطأ الشائعة والحلول المقترَحة:

admin_policy_enforced

لا يمكن لحساب Google منح الإذن بواحد أو أكثر من النطاقات المطلوبة بسبب سياسات مشرف Google Workspace. راجِع مقالة المساعدة في "مشرف Google Workspace" بعنوان التحكّم في اختيار التطبيقات الداخلية والخارجية التي يمكنها الوصول إلى بيانات Google Workspace لمزيد من المعلومات حول كيفية حظر المشرف للوصول إلى جميع النطاقات أو النطاقات الحسّاسة والمقيّدة إلى أن يتم منح إذن الوصول بشكل صريح إلى معرّف عميل OAuth.

disallowed_useragent

تظهر نقطة نهاية التفويض داخل وكيل مستخدم مضمّن لا تسمح به سياسات OAuth 2.0 من Google.

قد يواجه مطوّرو تطبيقات iOS وmacOS هذا الخطأ عند فتح طلبات الحصول على إذن في WKWebView. على المطوّرين بدلاً من ذلك استخدام مكتبات iOS، مثل تسجيل الدخول باستخدام حساب Google على iOS أو AppAuth على iOS من مؤسسة OpenID.

قد يواجه مطوّرو الويب هذا الخطأ عندما يفتح تطبيق iOS أو macOS رابط ويب عامًا في وكيل مستخدم مضمّن، وينتقِل المستخدم إلى نقطة نهاية تفويض OAuth 2.0 من Google من موقعك الإلكتروني. على المطوّرين السماح بفتح الروابط العامة في معالج الروابط التلقائي لنظام التشغيل، والذي يتضمّن كلاً من معالجات الروابط العامة أو تطبيق المتصفّح التلقائي. وتُعد مكتبة SFSafariViewController خيارًا متاحًا أيضًا.

org_internal

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

invalid_client

سر عميل OAuth غير صحيح. راجِع إعدادات عميل OAuth، بما في ذلك معرّف العميل وسر العميل المستخدَمَين في هذا الطلب.

deleted_client

تم حذف عميل OAuth المستخدَم لتقديم الطلب. يمكن أن تتم عملية الحذف يدويًا أو تلقائيًا في حالة العملاء غير النشطين . يمكن استعادة العملاء المحذوفين في غضون 30 يومًا من تاريخ الحذف. مزيد من المعلومات

invalid_grant

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

redirect_uri_mismatch

لا تتطابق قيمة redirect_uri التي تم إدخالها في طلب التفويض مع معرّف الموارد المنتظم (URI) المعتمَد لإعادة التوجيه لمعرّف عميل OAuth. راجِع معرّفات الموارد المنتظمة (URI) المعتمَدة لإعادة التوجيه في Google Cloud Console صفحة العملاء.

قد تشير المَعلمة redirect_uri إلى مسار OAuth خارج النطاق (OOB) الذي تم إيقافه نهائيًا ولم يعُد متاحًا. يُرجى الرجوع إلى دليل نقل البيانات لتعديل عملية الدمج.

invalid_request

حدث خطأ في الطلب الذي قدّمته. قد يرجع ذلك إلى عدة أسباب:

  • لم يتم تنسيق الطلب بشكل صحيح
  • لم يتضمّن الطلب المَعلمات المطلوبة
  • يستخدم الطلب طريقة لا تسمح بها Google لمنح إذن الوصول. التأكّد من أنّ عملية دمج OAuth تستخدم إحدى طرق الدمج المقترَحة

الخطوة 4: التعامل مع استجابة خادم OAuth 2.0

يستجيب خادم OAuth 2.0 لطلب الوصول الذي يرسله تطبيقك باستخدام عنوان URL المحدّد في الطلب.

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

ردّ يتضمّن خطأ:

https://oauth2.example.com/auth?error=access_denied

استجابة رمز التفويض:

https://oauth2.example.com/auth?code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7

نموذج استجابة خادم OAuth 2.0

يمكنك اختبار هذا المسار من خلال النقر على عنوان URL النموذجي التالي الذي يطلب إذن الوصول للقراءة فقط من أجل عرض البيانات الوصفية للملفات في Google Drive وإذن الوصول للقراءة فقط من أجل عرض أحداث "تقويم Google":

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 access_type=offline&
 include_granted_scopes=true&
 state=state_parameter_passthrough_value&
 redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback&
 response_type=code&
 client_id=client_id

بعد إكمال مسار OAuth 2.0، ستتم إعادة توجيهك من المتصفّح إلى مساحة بروتوكول OAuth 2.0، وهي أداة لاختبار مسارات OAuth. ستلاحظ أنّ "مساحة بروتوكول OAuth 2.0" قد سجّلت رمز التفويض تلقائيًا.

الخطوة 5: تبديل رمز التفويض برموز مميّزة لإعادة التحميل والدخول

بعد أن يتلقّى خادم الويب رمز التفويض، يمكنه تبديل رمز التفويض برمز مميّز للوصول.

PHP

لتبديل رمز تفويض برمز دخول، استخدِم طريقة fetchAccessTokenWithAuthCode:

$access_token = $client->fetchAccessTokenWithAuthCode($_GET['code']);

Python

في صفحة معاودة الاتصال، استخدِم مكتبة google-auth للتحقّق من ردّ خادم التفويض. بعد ذلك، استخدِم طريقة flow.fetch_token لتبديل رمز التفويض في تلك الاستجابة برمز دخول:

state = flask.session['state']
flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
    'client_secret.json',
    scopes=['https://www.googleapis.com/auth/youtube.force-ssl'],
    state=state)
flow.redirect_uri = flask.url_for('oauth2callback', _external=True)

authorization_response = flask.request.url
flow.fetch_token(authorization_response=authorization_response)

# Store the credentials in browser session storage, but for security: client_id, client_secret,
# and token_uri are instead stored only on the backend server.
credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'granted_scopes': credentials.granted_scopes}

Ruby

في صفحة معاودة الاتصال، استخدِم مكتبة googleauth للتحقّق من ردّ خادم التفويض. استخدِم طريقة authorizer.handle_auth_callback_deferred لحفظ رمز التفويض وإعادة التوجيه إلى عنوان URL الذي طلب التفويض في الأصل. يؤجّل هذا الإجراء تبادل الرمز من خلال تخزين النتائج مؤقتًا في جلسة المستخدم.

  target_url = Google::Auth::WebUserAuthorizer.handle_auth_callback_deferred(request)
  redirect target_url

Node.js

لتبديل رمز تفويض برمز دخول، استخدِم طريقة getToken:

const url = require('url');

// Receive the callback from Google's OAuth 2.0 server.
app.get('/oauth2callback', async (req, res) => {
  let q = url.parse(req.url, true).query;

  if (q.error) { // An error response e.g. error=access_denied
    console.log('Error:' + q.error);
  } else if (q.state !== req.session.state) { //check state value
    console.log('State mismatch. Possible CSRF attack');
    res.end('State mismatch. Possible CSRF attack');
  } else { // Get access and refresh tokens (if access_type is offline)

    let { tokens } = await oauth2Client.getToken(q.code);
    oauth2Client.setCredentials(tokens);
});

HTTP/REST

لتبديل رمز تفويض برمز دخول، عليك استدعاء نقطة النهاية https://oauth2.googleapis.com/token وضبط المَعلمات التالية:

الحقول
client_id معرّف العميل الذي تم الحصول عليه من صفحة العملاء في Cloud Console
client_secret اختياريّ

سرّ العميل الذي تم الحصول عليه من Cloud Console صفحة العملاء

code رمز التفويض الذي تم عرضه من الطلب الأوّلي.
grant_type وفقًا لما هو محدّد في مواصفات OAuth 2.0، يجب ضبط قيمة هذا الحقل على authorization_code.
redirect_uri أحد معرّفات الموارد المنتظمة (URI) لإعادة التوجيه المُدرَجة لمشروعك في صفحة "العملاء" في Cloud Console client_id.

على الرغم من أنّ استخدام DPoP اختياري، ننصح به لزيادة الأمان. يعتمد أمان DPoP على حصر المفتاح الخاص بجهاز واحد، وننصح بتخزينه بطريقة لا يمكن نسخها من الجهاز، مثلاً باستخدام وحدات TPM أو Secure Enclaves أو غيرها من مخازن المفاتيح المستنِدة إلى الأجهزة. لاستخدام DPoP، يجب أن ينشئ تطبيقك رمز JWT جديدًا وفريدًا لإثبات DPoP لكل طلب يتم إرساله إلى نقطة نهاية الرمز المميز، وأن يضيفه كعنوان طلب HTTP.

العنوان مطلوب الوصف
DPoP اختياري مستند إثبات DPoP هو رمز JWT يثبت امتلاك مفتاح خاص. هذا عنوان وليس مَعلمة. في حال توفّره، سيتم ربط الرموز المميزة التي يتم عرضها بهذا المفتاح. يجب إنشاء مستند إثبات جديد وفريد لكل طلب، ويجب أن يتضمّن المستند المطالبات htm (طريقة HTTP) وhtu (معرّف الموارد المنتظم HTTP) التي تتطابق مع الطلب.

يعرض المقتطف التالي نموذجًا لطلب:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded
DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6IkVTMjU2IiwiandrIjp7Imt0eSI6Ik\
 VDIiwieCI6Imw4dEZyaHgtMzR0VjNoUklDUkRZOXpDa0RscEJoRjQyVVFVZldWQVdCR\
 nMiLCJ5IjoiOVZFNGpmX09rX282NHpiVFRsY3VOSmFqSG10NnY5VERWclUwQ2R2R1JE\
 QSIsImNydiI6IlAtMjU2In19.eyJqdGkiOiItQndDM0VTYzZhY2MybFRjIiwiaHRtIj\
 oiUE9TVCIsImh0dSI6Imh0dHBzOi8vc2VydmVyLmV4YW1wbGUuY29tL3Rva2VuIiwia\
 WF0IjoxNTYyMjYyNjE2fQ.2-GxA6T8lP4vfrg8v-FdWP0A0zdrj8igiMLvqRMUvwnQg\
 4PtFLbdLXiOSsX0x7NVY-FNyJK70nfbV37xRZT3Lg

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
redirect_uri=https%3A//developers.google.com/oauthplayground&
grant_type=authorization_code

إنشاء مستند إثبات DPoP

توضّح الخطوات التالية كيفية إنشاء مستند إثبات DPoP باستخدام OpenSSL من سطر الأوامر:

  1. إنشاء مفتاحَي تشفير EC P-256:
    openssl ecparam -name prime256v1 -genkey -noout -out dpop_private.pem
    openssl ec -in dpop_private.pem -pubout -out dpop_public.pem
  2. إنشاء عنوان DPoP:

    يجب أن يتضمّن العنوان المطالبات typ وalg وjwk (المفتاح العام). قيمة x وy هي إحداثيات المفتاح العام لمنحنى القطع الناقص (EC) بترميز Base64Url. استخدِم ترميز Base64Url في JSON التالي:

    {
      "typ":"dpop+jwt",
      "alg":"ES256",
      "jwk": {
        "kty":"EC",
        "x":"YOUR_PUBLIC_KEY_X",
        "y":"YOUR_PUBLIC_KEY_Y",
        "crv":"P-256"
      }
    }
  3. إنشاء حمولة DPoP:

    يجب أن تتضمّن الحمولة jti (معرّفًا فريدًا للطلب) وhtm (طريقة HTTP، مثل POST) وhtu (معرّف الموارد المنتظم (URI) لبروتوكول HTTP، مثل https://oauth2.googleapis.com/token) وiat (وقت الإصدار). إذا تلقّيت قيمة nonce من الخادم في عنوان DPoP-Nonce ضمن الاستجابة لطلب سابق، عليك تضمين قيمة nonce هذه في مطالبة nonce. إنّ مطالبة nonce اختيارية لعمليات تبادل رموز التفويض، ولا يتم استخدامها إلا عند تلقّي عنوان DPoP-Nonce سابقًا. استخدِم ترميز Base64Url في JSON التالي:

    {
      "jti":"JTI_VALUE",
      "htm":"POST",
      "htu":"https://oauth2.googleapis.com/token",
      "iat":YOUR_JWT_ISSUED_TIME,
      "nonce":"SERVER_PROVIDED_NONCE"
    }

    تعتمد قيمة jti على نوع التبادل:

    • بالنسبة إلى عمليات تبادل رمز التفويض، يجب أن يكون jti عبارة عن قيمة تجزئة متوافقة مع SHA256 بترميز Base64Url لرمز التفويض: "jti":"BASE64URL(SHA256(AUTHORIZATION_CODE))".
    • بالنسبة إلى عمليات استبدال الرموز المميزة لإعادة التحميل، يجب أن يكون jti معرّفًا فريدًا لكل طلب: "jti":"YOUR_UNIQUE_PER_REQUEST_IDENTIFIER".
  4. توقيع المستند:

    يجب ربط العنوان والبيانات الأساسية المرمّزة بنقطة (.)، ثم توقيع النتيجة باستخدام مفتاحك الخاص من خلال ES256. يُرجى العِلم أنّ JWS يتطلّب أن تكون التوقيعات بتنسيق R | S متسلسل غير معالَج (64 بايت لـ P-256). في حال استخدام OpenSSL مباشرةً، يجب تحويل التوقيع التلقائي المرمّز بتنسيق ASN.1 DER إلى هذا التنسيق الأولي.

يتم الإشارة إلى عملية تبادل ناجحة من خلال استجابة 200 OK تحتوي على الرموز المميزة. إذا تم استخدام دليل صالح على إثبات الحيازة (DPoP) أثناء عملية التبادل، سيكون الرمز المميز لإعادة التحميل الذي تعرضه Google مرتبطًا بمفتاحك من خلال إثبات الحيازة، ولكن لن تكون رموز الدخول مرتبطة بإثبات الحيازة. ستحتفظ رموز الدخول بالقيمة token_type الخاصة بـ Bearer بدلاً من DPoP. بالإضافة إلى ذلك، تعرض Google عنوان HTTP DPoP-Nonce في الاستجابة. على العميل تخزين هذا الرقم الخاص مؤقتًا وتضمينه في مطالبة nonce في مستند إثبات DPoP في الطلبات اللاحقة (مثل تبديل الرمز المميز لإعادة التحميل برمز دخول جديد، أو عند استدعاء واجهات برمجة التطبيقات المحمية بواسطة DPoP). باستخدام قيمة nonce الصادرة مسبقًا، يمكنك تجنُّب حدوث خطأ إضافي في عملية تبادل البيانات (use_dpop_nonce) عند تقديم طلبك التالي.

يجب تضمين مستندات إثبات DPoP لطلبات استبدال الرموز المميزة التي يتم إجراؤها باستخدام رموز مميزة لإعادة التحميل مرتبطة بـ DPoP.

يحدث تبادل فاشل إذا كان عنوان DPoP غير متوفّر عند توقّعه، أو إذا كان غير صالح، أو إذا كانت صحة الإثبات تستخدم مفتاحًا مختلفًا عن المفتاح المرتبط بالرمز المميّز. في هذه الحالات، يعرض الخادم الخطأ 400 Bad Request. إذا كان دليل DPoP يتضمّن مطالبات htm أو htu غير متطابقة، أو iat منتهي الصلاحية، أو jti تمت إعادة استخدامه، أو توقيع غير صالح، تعرض Google رمز الخطأ invalid_dpop_proof. إذا كان يجب توفير قيمة nonce لبروتوكول DPoP، مثلاً أثناء تبادل الرموز المميزة لإعادة التحميل، ولم يتضمّن دليل DPoP مطالبة nonce، أو كانت قيمة nonce غير مقبولة لدى الخادم (مثلاً، انتهت صلاحيتها أو تم استخدامها من قبل أو كانت غير صحيحة)، تعرض Google رمز الخطأ use_dpop_nonce مع عنوان HTTP DPoP-Nonce الذي يحتوي على قيمة nonce جديدة يمكنك استخدامها في طلب لاحق. قد تعرض حالات تعذُّر التثبيت الأخرى الرمز invalid_grant.

تستجيب Google لهذا الطلب من خلال عرض عنصر JSON يحتوي على رمز دخول قصير الأمد ورمز مميز لإعادة التحميل. يُرجى العِلم أنّه لا يتم عرض الرمز المميز لإعادة التحميل إلا إذا ضبط تطبيقك المَعلمة access_type على offline في الطلب الأوّلي إلى خادم التفويض من Google.

يتضمّن الردّ الحقول التالية:

الحقول
access_token الرمز المميز الذي يرسله تطبيقك للموافقة على طلب بيانات من واجهة برمجة تطبيقات Google.
expires_in تمثّل هذه السمة مدة صلاحية رمز الدخول المتبقية بالثواني.
refresh_token رمز مميّز يمكنك استخدامه للحصول على رمز دخول جديد تكون الرموز المميزة لإعادة التحميل صالحة إلى أن يبطل المستخدم إذن الوصول أو تنتهي صلاحية الرمز المميز لإعادة التحميل. في حال استخدام DPoP، يكون الرمز المميز لإعادة التحميل مرتبطًا بالمفتاح الخاص المستخدَم لتوقيع مستند إثبات DPoP. مرة أخرى، لا يظهر هذا الحقل في الردّ إلا إذا ضبطت المَعلمة access_type على القيمة offline في الطلب الأوّلي إلى خادم التفويض من Google.
refresh_token_expires_in تعرض هذه السمة مدة صلاحية الرمز المميز لإعادة التحميل المتبقية بالثواني. لا يتم ضبط هذه القيمة إلا عندما يمنح المستخدم إذن الوصول المستند إلى الوقت.
scope نطاقات الوصول التي يمنحها access_token معبَّر عنها كقائمة من السلاسل الحساسة لحالة الأحرف والمفصولة بمسافات.
token_type تمثّل هذه السمة نوع الرمز المميّز الذي يتم عرضه. تكون هذه القيمة دائمًا Bearer، حتى عند استخدام DPoP.

يعرض المقتطف التالي نموذجًا ناجحًا لعناوين الاستجابة ونصها عند استخدام DPoP:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
DPoP-Nonce: AN3XwJjZsjnb0ZuWkRlek8QU7wY-Zhf-5IP6tO0tORz0KgtDT1Bo8FX-w4nz3r5lnepI

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/youtube.force-ssl",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

الأخطاء

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

invalid_grant

رمز التفويض المقدَّم غير صالح أو بتنسيق غير صحيح. اطلب رمزًا جديدًا من خلال إعادة تشغيل عملية OAuth لطلب موافقة المستخدم مرة أخرى.

الخطوة 6: التحقّق من النطاقات التي منحها المستخدمون

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

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

لمزيد من المعلومات التفصيلية، يُرجى الاطّلاع على كيفية التعامل مع الأذونات الدقيقة.

PHP

للاطّلاع على النطاقات التي منحها المستخدم، استخدِم طريقة getGrantedScope():

// Space-separated string of granted scopes if it exists, otherwise null.
$granted_scopes = $client->getOAuth2Service()->getGrantedScope();

Python

يحتوي العنصر credentials الذي يتم عرضه على السمة granted_scopes، وهي قائمة بالنطاقات التي منحها المستخدم لتطبيقك.

credentials = flow.credentials
flask.session['credentials'] = {
    'token': credentials.token,
    'refresh_token': credentials.refresh_token,
    'granted_scopes': credentials.granted_scopes}

Ruby

عند طلب نطاقات متعددة في الوقت نفسه، تحقَّق من النطاقات التي تم منحها من خلال السمة scope الخاصة بالكائن credentials.

# User authorized the request. Now, check which scopes were granted.
if