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

يتيح نظام OAuth 2.0 من Google استخدام التفاعلات من خادم إلى خادم مثل تلك بين الويب. أحد التطبيقات وخدمة Google. بالنسبة إلى هذا السيناريو، تحتاج إلى حساب خدمة، والذي هو حساب ينتمي إلى تطبيقك بدلاً من مستخدم فردي. يستدعي التطبيق واجهات Google APIs نيابةً عن حساب الخدمة، لذلك لا المشاركة. يُسمى هذا السيناريو أحيانًا "بروتوكول OAuth الثنائي"، أو "2LO." (المصطلح ذي الصلة "بروتوكول OAuth الثلاثي" يشير إلى السيناريوهات التي يستدعي فيها تطبيقك واجهات Google APIs نيابةً عنك من المستخدمين، والتي تتطلب أحيانًا موافقة المستخدم).

عادةً ما يستخدم التطبيق حساب خدمة عند استخدام التطبيق لواجهات Google APIs للعمل ببياناته الخاصة بدلاً من بيانات المستخدم. على سبيل المثال، أحد التطبيقات التي تستخدم Google Cloud قد يستخدم مخزن البيانات للحفاظ على البيانات حساب خدمة لمصادقة عمليات الاتصال به واجهة برمجة تطبيقات تخزين البيانات في Google Cloud.

يمكن لمشرفي نطاقات Google Workspace أيضًا منح حسابات الخدمة تفويضًا على مستوى النطاق للوصول إلى المستخدم نيابةً عن المستخدمين في النطاق.

يشرح هذا المستند كيف يمكن لأحد التطبيقات إكمال تدفق OAuth 2.0 من خادم إلى خادم من خلال باستخدام مكتبة برامج Google APIs (خيار يُنصَح به) أو بروتوكول HTTP.

نظرة عامة

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

بعد ذلك، يستعد تطبيقك لإجراء طلبات بيانات اعتماد معتمدة من واجهة برمجة التطبيقات باستخدام إعدادات بيانات الاعتماد لطلب رمز الدخول من خادم مصادقة OAuth 2.0.

وأخيرًا، يمكن لتطبيقك استخدام رمز الدخول لاستدعاء واجهات برمجة تطبيقات Google.

إنشاء حساب خدمة

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

إذا كان تطبيقك يعمل على Google App Engine، سيتم إعداد حساب خدمة تلقائيًا عند في إنشاء مشروعك.

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

إذا كان تطبيقك لا يعمل على Google App Engine أو Google Compute Engine، يجب عليك الحصول على بيانات الاعتماد هذه في Google API Console. لإنشاء حساب الخدمة أو لعرض بيانات الاعتماد العامة التي قمت بإنشائها بالفعل، قم بما يلي:

أولاً ، قم بإنشاء حساب خدمة:

  1. افتح Service accounts page.
  2. If prompted, select a project, or create a new one.
  3. انقر فوق إنشاء حساب الخدمة .
  4. ضمن تفاصيل حساب الخدمة ، اكتب اسمًا ومعرفًا ووصفًا لحساب الخدمة ، ثم انقر فوق إنشاء ومتابعة .
  5. اختياري: ضمن منح حق الوصول إلى حساب الخدمة هذا للمشروع ، حدد أدوار IAM لمنح حساب الخدمة.
  6. انقر فوق متابعة .
  7. اختياري: ضمن منح المستخدمين حق الوصول إلى حساب الخدمة هذا ، أضف المستخدمين أو المجموعات المسموح لها باستخدام حساب الخدمة وإدارته.
  8. انقر فوق تم .

بعد ذلك ، قم بإنشاء مفتاح حساب الخدمة:

  1. انقر فوق عنوان البريد الإلكتروني لحساب الخدمة الذي أنشأته.
  2. انقر فوق علامة التبويب المفاتيح .
  3. في القائمة المنسدلة إضافة مفتاح ، حدد إنشاء مفتاح جديد .
  4. انقر فوق إنشاء .

يتم إنشاء زوج المفاتيح العام / الخاص الجديد وتنزيله على جهازك ؛ إنه بمثابة النسخة الوحيدة من المفتاح الخاص. أنت مسؤول عن تخزينه بشكل آمن. إذا فقدت زوج المفاتيح هذا ، فستحتاج إلى إنشاء زوج جديد.

يمكنك الرجوع إلى API Console في أي وقت لعرض عنوان البريد الإلكتروني العلني البصمات المرجعية الرئيسية والمعلومات الأخرى، أو إنشاء أزواج مفاتيح عامة/خاصة إضافية. بالنسبة مزيد من التفاصيل حول بيانات اعتماد حساب الخدمة في API Console، عرض حسابات الخدمة في API Console ملف المساعدة.

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

تفويض صلاحية على مستوى النطاق لحساب الخدمة

باستخدام حساب Google Workspace، يمكن لمشرف Workspace في المؤسسة تفويض تطبيق للوصول إلى بيانات مستخدمي Workspace نيابةً عن المستخدمين في نطاق Google Workspace. على سبيل المثال: تطبيق يستخدم Google Calendar API لإضافة الأحداث إلى تقاويم جميع المستخدمين في نطاق Google Workspace قد يستخدم حساب خدمة للوصول إلى Google Calendar API على بالنيابة عن المستخدمين. تفويض حساب خدمة للوصول إلى البيانات نيابةً عن المستخدمين في أحد النطاقات هو يُشار إليه أحيانًا باسم "تفويض المرجع على مستوى النطاق" بحساب خدمة.

لتفويض السلطة على مستوى النطاق لحساب خدمة، يكون المشرف المتميّز في Google على نطاق Workspace إكمال الخطوات التالية:

  1. من نطاق Google Workspace الخاص بك: وحدة تحكّم المشرف، انتقِل إلى القائمة الرئيسية > الأمان > التحكّم بالبيانات والوصول > عناصر تحكُّم واجهة برمجة التطبيقات:
  2. في لوحة التفويض على مستوى النطاق، اختَر إدارة التفويض على مستوى النطاق.
  3. انقر على إضافة فلتر جديد.
  4. في الحقل معرّف العميل، أدخِل رقم تعريف العميل لحساب الخدمة. يمكنك الاطّلاع على معرِّف العميل لحساب الخدمة لديك في Service accounts page
  5. في حقل نطاقات OAuth (مفصولة بفواصل)، أدخِل قائمة النطاقات التي حق الوصول إليها. على سبيل المثال، إذا كان التطبيق يحتاج إلى إجراءات على مستوى النطاق حق الوصول الكامل إلى واجهة برمجة تطبيقات Google Drive وواجهة برمجة تطبيقات تقويم Google، أدخل: https://www.googleapis.com/auth/drive أو https://www.googleapis.com/auth/calendar.
  6. انقر على تفويض.

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

التحضير لإجراء طلب مفوَّض لواجهة برمجة التطبيقات

Java

بعد الحصول على عنوان البريد الإلكتروني للعميل والمفتاح الخاص من ملف API Console، يمكنك استخدام مكتبة برامج Google APIs للغة Java لإنشاء عنصر GoogleCredential من بيانات اعتماد حساب الخدمة النطاقات التي يحتاج تطبيقك إلى الوصول إليها. على سبيل المثال:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.sqladmin.SQLAdminScopes;

// ...

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN));

إذا كنت تطوّر تطبيقًا على Google Cloud Platform، يمكنك استخدام بيانات الاعتماد التلقائية للتطبيق بدلاً من ذلك، مما قد يؤدي إلى تبسيط العملية.

تفويض التفويض على مستوى النطاق

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

GoogleCredential credential = GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"))
    .createScoped(Collections.singleton(SQLAdminScopes.SQLSERVICE_ADMIN))
    .createDelegated("workspace-user@example.com");

يستخدم الرمز أعلاه الكائن GoogleCredential لطلب createDelegated(). . يجب أن تكون وسيطة الطريقة createDelegated() مستخدمًا ينتمي إلى Google Workspace. سيستخدم الرمز الذي يرسل الطلب بيانات الاعتماد هذه للاتصال بـ Google. واجهات برمجة التطبيقات باستخدام حساب الخدمة الخاص بك

Python

بعد الحصول على عنوان البريد الإلكتروني للعميل والمفتاح الخاص من ملف API Console، يمكنك استخدام مكتبة برامج Google APIs للغة Python لإكمال الخطوات التالية:

  1. أنشئ عنصر Credentials من بيانات اعتماد حساب الخدمة النطاقات التي يحتاج تطبيقك إلى الوصول إليها. مثل:
    from google.oauth2 import service_account
    
    SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
    SERVICE_ACCOUNT_FILE = '/path/to/service.json'
    
    credentials = service_account.Credentials.from_service_account_file(
            SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    إذا كنت تطوّر تطبيقًا على Google Cloud Platform، يمكنك استخدام بيانات الاعتماد التلقائية للتطبيق بدلاً من ذلك، مما قد يؤدي إلى تبسيط العملية.

  2. تفويض التفويض على مستوى النطاق

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

    delegated_credentials = credentials.with_subject('user@example.org')

استخدِم كائن Credentials لطلب Google APIs في تطبيقك.

HTTP/REST

بعد الحصول على معرِّف العميل والمفتاح الخاص من ملف API Console، يجب على طلبك إكمال الخطوات التالية:

  1. أنشئ رمز JSON المميّز للويب (JWT، يُلفظ "jot")، والذي يتضمّن عنوانًا ومجموعة مطالبات والتوقيع.
  2. اطلب رمز الدخول من خادم تفويض OAuth 2.0 في Google.
  3. تعامل مع استجابة JSON التي يعرضها خادم التفويض.

توضح الأقسام التالية كيفية إكمال هذه الخطوات.

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

عند انتهاء صلاحية رمز الدخول، ينشئ تطبيقك رمز دخول آخر يقوم JWT بتوقيعه وطلب رمز دخول آخر.

يستخدم تطبيق الخادم JWT لطلب رمز مميز من Google
                  خادم التفويض، يستخدم بعد ذلك الرمز المميز لاستدعاء نقطة نهاية واجهة برمجة تطبيقات Google. لا
                  مشاركة المستخدم النهائي.

يصف باقي هذا القسم تفاصيل إنشاء JWT وتوقيع JWT وتشكيل طلب رمز الدخول والتعامل مع الاستجابة.

إنشاء JWT

يتكون JWT من ثلاثة أجزاء: العنوان، ومجموعة المطالبة، التوقيع. العنوان ومجموعة المطالبات هما كائنات JSON. ويتم ترتيب كائنات JSON هذه بشكل تسلسلي UTF-8 بايت، ثم تم تشفيرها باستخدام تشفير Base64url. يوفر هذا الترميز المرونة ضد تغييرات الترميز بسبب عمليات الترميز المتكررة. العنوان ومجموعة المطالبة يتم تجميع التوقيع مع حرف نقطة (.).

يتكون JWT على النحو التالي:

{Base64url encoded header}.{Base64url encoded claim set}.{Base64url encoded signature}

السلسلة الأساسية للتوقيع هي كما يلي:

{Base64url encoded header}.{Base64url encoded claim set}
تكوين عنوان JWT

يتكون العنوان من ثلاثة حقول تشير إلى خوارزمية التوقيع، وتنسيق والتأكيد و[key ID of the service account key](https://cloud.google.com/iam/docs/reference/rest/v1/projects.serviceAccounts.keys) الذي تم استخدامه للتوقيع على JWT. تعد الخوارزمية والتنسيق إلزاميين، ويحتوي كل حقل على قيمة واحدة. عند تقديم خوارزميات وتنسيقات إضافية، سيتغير هذا العنوان وفقًا لذلك. رقم تعريف المفتاح اختياري، وفي حال تحديد رقم تعريف مفتاح غير صحيح، سيحاول GCP. جميع المفاتيح المرتبطة بحساب الخدمة للتحقّق من الرمز المميّز ورفضه في حال لم يتم العثور على مفتاح صالح. تحتفظ Google بالحق في رفض الرموز المميزة التي تتضمن معرّفات مفاتيح غير صحيحة في المستقبل.

تعتمد حسابات الخدمة على خوارزمية RSA SHA-256 وتنسيق رمز JWT المميّز. وبالتالي في ما يلي تمثيل JSON للرأس:

{"alg":"RS256","typ":"JWT", "kid":"370ab79b4513eb9bad7c9bd16a95cb76b5b2a56a"}

في ما يلي تمثيل Base64url لهذا العنوان:

          eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsICJraWQiOiIzNzBhYjc5YjQ1MTNlYjliYWQ3YzliZDE2YTk1Y2I3NmI1YjJhNTZhIn0=
تشكيل مجموعة مطالبة JWT

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

مطالبات مطلوبة

في ما يلي المطالبات المطلوبة في مجموعة مطالبات JWT. قد تظهر بأي ترتيب مجموعة المطالبة.

الاسم الوصف
iss عنوان البريد الإلكتروني لحساب الخدمة.
scope قائمة بالأذونات التي يطلبها التطبيق مع الفصل بينها بمسافات.
aud واصف للهدف المقصود من التأكيد. عند إنشاء رمز دخول أن تطلب هذه القيمة دائمًا هي https://oauth2.googleapis.com/token.
exp وقت انتهاء صلاحية التأكيد، محدد بالثواني منذ 00:00:00 بالتوقيت العالمي المنسق (UTC) 1 يناير 1970 تستغرق هذه القيمة ساعة واحدة كحد أقصى بعد وقت الإصدار.
iat وقت إصدار التأكيد، والمحدد بالثواني منذ 00:00:00 بالتوقيت العالمي المنسق (UTC)، 1 يناير 1970

في ما يلي تمثيل JSON للحقول المطلوبة في مجموعة مطالبات JWT:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/devstorage.read_only",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
مطالبات إضافية

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

للحصول على رمز دخول يمنح أحد التطبيقات الإذن بالوصول المفوَّض إلى أحد الموارد، تضمين عنوان البريد الإلكتروني للمستخدم في مطالبة JWT المضبوطة كقيمة الحقل "sub".

الاسم الوصف
sub عنوان البريد الإلكتروني للمستخدم الذي يطلب التطبيق تفويضًا من أجله الوصول إليه.

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

نعرض لك مثالاً على مجموعة مطالبات JWT التي تشمل الحقل sub. أدناه:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "sub": "some.user@example.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
ترميز مجموعة مطالبة JWT

مثل عنوان JWT، يجب أن تكون مجموعة مطالبات JWT تسلسلية إلى UTF-8 وBase64url-safe. مشفّرة. في ما يلي مثال على تمثيل JSON لمجموعة مطالبات JWT:

{
  "iss": "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
  "scope": "https://www.googleapis.com/auth/prediction",
  "aud": "https://oauth2.googleapis.com/token",
  "exp": 1328554385,
  "iat": 1328550785
}
حساب التوقيع

توقيع الويب JSON (JWS) هي المواصفات التي توجه آليات إنشاء التوقيع JWT. إدخال التوقيع هو صفيف البايت للمحتوى التالي:

{Base64url encoded header}.{Base64url encoded claim set}

يجب استخدام خوارزمية التوقيع في عنوان JWT عند حساب التوقيع. تشير رسالة الأشكال البيانية فقط خوارزمية التوقيع المتوافقة مع خادم تفويض OAuth 2.0 من Google هي RSA باستخدام خوارزمية التجزئة SHA-256. يتم التعبير عن ذلك باسم RS256 في alg في عنوان JWT.

وقِّع على تمثيل UTF-8 للإدخال باستخدام SHA256withRSA (المعروفة أيضًا باسم RSASSA-PKCS1-V1_5-SIGN مع دالة التجزئة SHA-256) باستخدام المفتاح الخاص الذي تم الحصول عليه من Google API Consoleستكون المخرجات صفيفة بايت.

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

{Base64url encoded header}.
{Base64url encoded claim set}.
{Base64url encoded signature}

في ما يلي مثال على JWT قبل ترميز Base64url:

{"alg":"RS256","typ":"JWT"}.
{
"iss":"761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/prediction",
"aud":"https://oauth2.googleapis.com/token",
"exp":1328554385,
"iat":1328550785
}.
[signature bytes]

في ما يلي مثال على JWT تم توقيعه وجاهز للإرسال:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92NC90b2tlbiIsImV4cCI6MTMyODU1NDM4NSwiaWF0IjoxMzI4NTUwNzg1fQ.UFUt59SUM2_AW4cRU8Y0BYVQsNTo4n7AFsNrqOpYiICDu37vVt-tw38UKzjmUKtcRsLLjrR3gFW3dNDMx_pL9DVjgVHDdYirtrCekUHOYoa1CMR66nxep5q5cBQ4y4u2kIgSvChCTc9pmLLNoIem-ruCecAJYgI9Ks7pTnW1gkOKs0x3YpiLpzplVHAkkHztaXiJdtpBcY1OXyo6jTQCa3Lk2Q3va1dPkh_d--GU2M5flgd8xNBPYw4vxyt0mP59XZlHMpztZt0soSgObf7G3GXArreF_6tpbFsS3z2t5zkEiHuWJXpzcYr5zWTRPDEHsejeBSG8EgpLDce2380ROQ

جارٍ إجراء طلب رمز الدخول

بعد إنشاء JWT الموقَّع، يمكن للتطبيق استخدامه لطلب رمز الدخول. طلب رمز الدخول هذا هو طلب HTTPS POST، والنص الأساسي هو عنوان URL مشفّرة. في ما يلي عنوان URL:

https://oauth2.googleapis.com/token

المعلمات التالية مطلوبة في طلب HTTPS POST:

الاسم الوصف
grant_type استخدِم السلسلة التالية، مع ترميز عنوان URL حسب الضرورة: urn:ietf:params:oauth:grant-type:jwt-bearer
assertion JWT، بما في ذلك التوقيع.

في ما يلي ملف تفريغ أوّلي لطلب HTTPS POST المستخدَم في رمز دخول. الطلب:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.ixOUGehweEVX_UKXv5BbbwVEdcz6AYS-6uQV6fGorGKrHf3LIJnyREw9evE-gs2bmMaQI5_UbabvI4k-mQE4kBqtmSpTzxYBL1TCd7Kv5nTZoUC1CmwmWCFqT9RE6D7XSgPUh_jF1qskLa2w0rxMSjwruNKbysgRNctZPln7cqQ

في ما يلي الطلب نفسه باستخدام curl:

curl -d 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiI3NjEzMjY3OTgwNjktcjVtbGpsbG4xcmQ0bHJiaGc3NWVmZ2lncDM2bTc4ajVAZGV2ZWxvcGVyLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzY29wZSI6Imh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL2F1dGgvcHJlZGljdGlvbiIsImF1ZCI6Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9vL29hdXRoMi90b2tlbiIsImV4cCI6MTMyODU3MzM4MSwiaWF0IjoxMzI4NTY5NzgxfQ.RZVpzWygMLuL-n3GwjW1_yhQhrqDacyvaXkuf8HcJl8EtXYjGjMaW5oiM5cgAaIorrqgYlp4DPF_GuncFqg9uDZrx7pMmCZ_yHfxhSCXru3gbXrZvAIicNQZMFxrEEn4REVuq7DjkTMyCMGCY1dpMa8aWfTQFt3Eh7smLchaZsU
' https://oauth2.googleapis.com/token

التعامل مع الردّ

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

{
  "access_token": "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "scope": "https://www.googleapis.com/auth/prediction"
  "token_type": "Bearer",
  "expires_in": 3600
}

ويمكن إعادة استخدام رموز الدخول خلال فترة المدة التي يحددها قيمة expires_in.

الاتصال بـ Google APIs

Java

استخدِم الكائن GoogleCredential لاستدعاء Google APIs من خلال إكمال الخطوات التالية:

  1. أنشِئ عنصر خدمة لواجهة برمجة التطبيقات التي تريد طلبها باستخدام عنصر GoogleCredential. مثلاً:
    SQLAdmin sqladmin =
        new SQLAdmin.Builder(httpTransport, JSON_FACTORY, credential).build();
  2. يمكنك تقديم طلبات إلى خدمة واجهة برمجة التطبيقات باستخدام الواجهة التي يوفّرها عنصر الخدمة على سبيل المثال، لإدراج مثيلات قواعد بيانات Cloud SQL في النموذج المثير-example-123 المشروع:
    SQLAdmin.Instances.List instances =
        sqladmin.instances().list("exciting-example-123").execute();

Python

يمكنك استخدام الكائن Credentials المفوّض لاستدعاء Google APIs من خلال إكمال الخطوات التالية:

  1. أنشِئ عنصر خدمة لواجهة برمجة التطبيقات التي تريد طلبها. تُنشئ عنصر خدمة من خلال استدعاء الدالة build باسم واجهة برمجة التطبيقات وإصدارها عنصر Credentials معتمد. على سبيل المثال، لطلب الإصدار 1beta3 من واجهة برمجة التطبيقات لإدارة Cloud SQL:
    import googleapiclient.discovery
    
    sqladmin = googleapiclient.discovery.build('sqladmin', 'v1beta3', credentials=credentials)
  2. يمكنك تقديم طلبات إلى خدمة واجهة برمجة التطبيقات باستخدام الواجهة التي يوفّرها عنصر الخدمة على سبيل المثال، لإدراج مثيلات قواعد بيانات Cloud SQL في النموذج المثير-example-123 المشروع:
    response = sqladmin.instances().list(project='exciting-example-123').execute()

HTTP/REST

بعد حصول تطبيقك على رمز الدخول، يمكنك استخدام الرمز لإجراء اتصالات واجهة برمجة التطبيقات نيابةً عن حساب خدمة معيّن أو حساب مستخدم في حال منح نطاقات الوصول التي تطلبها واجهة برمجة التطبيقات. للقيام بذلك، قم بتضمين رمز الدخول في طلب إلى واجهة برمجة التطبيقات عن طريق تضمين طلب بحث access_token مَعلمة أو قيمة Bearer لعنوان HTTP يتضمّن Authorization. عندما يكون ذلك ممكنًا، ويُفضل استخدام عنوان HTTP، لأن سلاسل طلبات البحث غالبًا ما تكون مرئية في سجلات الخادم. في معظم يمكنك استخدام مكتبة برامج لإعداد الطلبات إلى Google APIs (على سبيل المثال، عند طلب واجهة برمجة تطبيقات ملفات Drive).

يمكنك تجربة جميع واجهات Google APIs وعرض نطاقاتها من خلال ملعب OAuth 2.0.

أمثلة على الحصول على HTTP

اتصال drive.files نقطة النهاية (واجهة برمجة تطبيقات ملفات Drive) باستخدام Authorization: Bearer HTTP على النحو التالي. ملاحظة: يجب تحديد رمز الدخول الخاص بك:

GET /drive/v2/files HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

إليك طلب بيانات من واجهة برمجة التطبيقات نفسها للمستخدم الذي تمت مصادقته باستخدام access_token مَعلمة سلسلة طلب البحث:

GET https://www.googleapis.com/drive/v2/files?access_token=access_token

أمثلة على curl

يمكنك اختبار هذه الأوامر باستخدام تطبيق سطر الأوامر curl. إليك مثال يستخدم خيار عنوان HTTP (مفضّل):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/drive/v2/files

أو بدلاً من ذلك، خيار مَعلمة سلسلة طلب البحث:

curl https://www.googleapis.com/drive/v2/files?access_token=access_token

عند انتهاء صلاحية رموز الدخول

تنتهي صلاحية رموز الدخول الصادرة عن خادم تفويض OAuth 2.0 في Google بعد المدة التي تقدمها القيمة expires_in. عند انتهاء صلاحية رمز الدخول، فعندئذٍ إنشاء ملف JWT آخر وتوقيعه وطلب رمز دخول آخر.

رموز خطأ JWT

حقل واحد (error) حقل واحد (error_description) المعنى كيفية الحل
unauthorized_client Unauthorized client or scope in request. إذا كنت تحاول استخدام تفويض على مستوى النطاق، فإن حساب الخدمة غير مصرح به في وحدة تحكم المشرف لنطاق المستخدم.

تأكَّد من أنّ حساب الخدمة مُصرَّح به في التفويض على مستوى النطاق في "وحدة تحكُّم المشرف" للمستخدم في مطالبة واحدة (sub) (حقل)

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

unauthorized_client Client is unauthorized to retrieve access tokens using this method, or client not authorized for any of the scopes requested. تم تفويض حساب الخدمة باستخدام عنوان البريد الإلكتروني للعميل بدلاً من معرِّف العميل. (رقمية) في "وحدة تحكّم المشرف". في قسم التفويض على مستوى النطاق في "وحدة تحكُّم المشرف"، أزِل العميل وأعِد إضافته بالمعرف الرقمي.
access_denied (أي قيمة) في حال كنت تستخدم التفويض على مستوى النطاق، لا يتم تفويض نطاق واحد أو أكثر من النطاقات المطلوبة. في وحدة تحكم المشرف.

تأكَّد من أنّ حساب الخدمة مُصرَّح به في التفويض على مستوى النطاق في "وحدة تحكُّم المشرف" للمستخدم في sub مطالبة (حقل)، وأنّها تتضمّن كل النطاقات التي تطلبها في مطالبة scope المقدّمة من JWT

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

admin_policy_enforced (أي قيمة) يتعذّر على حساب Google تفويض نطاق واحد أو أكثر من النطاقات المطلوبة بسبب سياسات مشرف Google Workspace.

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

invalid_client (أي قيمة)

عميل OAuth أو الرمز المميّز JWT غير صالح أو تم ضبطه بشكلٍ غير صحيح.

يُرجى الاطّلاع على وصف الخطأ لمعرفة التفاصيل.

تأكد من أن رمز JWT المميز صالح ويحتوي على مطالبات صحيحة.

التحقُّق من صحة برنامج OAuth وحساب الخدمة بشكل صحيح، وأنك تستخدم عنوان البريد الإلكتروني الصحيح.

يُرجى التحقق من صحة رمز JWT المميز وإصداره لمعرِّف العميل في طلبك.

invalid_grant Not a valid email. المستخدم غير موجود. تأكَّد من صحة عنوان البريد الإلكتروني الوارد في المطالبة (الحقل) في sub.
invalid_grant

Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your 'iat' and 'exp' values and use a clock with skew to account for clock differences between systems.

وعادةً ما يعني ذلك أن وقت النظام المحلي غير صحيح. يمكن أن يحدث أيضًا إذا تم تزيد قيمة exp عن 65 دقيقة في المستقبل من قيمة iat، أو قيمة exp أقل من قيمة iat.

تأكد من صحة ساعة النظام التي يتم فيها إنشاء JWT. في حال حذف قم بمزامنة وقتك مع Google NTP.

invalid_grant Invalid JWT Signature.

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

بدلاً من ذلك، قد يتم ترميز تأكيد JWT بشكل غير صحيح - يجب أن يكون بترميز Base64، بدون أسطر جديدة أو علامات يساوي المساحة المتروكة

فك ترميز مجموعة مطالبات JWT والتحقّق من ارتباط المفتاح الذي تم توقيع التأكيد عليه باستخدام حساب الخدمة.

جرِّب استخدام مكتبة OAuth التي توفّرها Google للتأكّد من إنشاء JWT بشكل صحيح.

invalid_scope Invalid OAuth scope or ID token audience provided. لم يتم طلب أي نطاقات (قائمة فارغة للنطاقات)، أو لم يتم طلب أي من النطاقات المطلوبة موجودة (أي أنها غير صالحة).

تأكَّد من تعبئة المطالبة (الحقل) scope الخاصة بـ JWT ومقارنتها النطاقات التي يحتوي عليها مع النطاقات الموثقة لواجهات برمجة التطبيقات التي تريد استخدامها، والتأكد من عدم وجود أخطاء أو أخطاء إملائية.

يجب فصل قائمة النطاقات في مطالبة scope حسب مسافات وليس فواصل.

disabled_client The OAuth client was disabled. تم إيقاف المفتاح المستخدم للتوقيع على تأكيد JWT.

انتقِل إلى Google API Console، وضمن إدارة الهوية وإمكانية الوصول وحدة تحكّم المشرف > حسابات الخدمة: فعِّل حساب الخدمة الذي يحتوي على "رقم تعريف المفتاح". مستخدَمة للتوقيع على التأكيد.

org_internal This client is restricted to users within its organization. معرِّف عميل OAuth في الطلب هو جزء من مشروع يحدّ من إمكانية الوصول إلى Google الحسابات في حساب مؤسسة Google Cloud:

استخدام حساب خدمة من المؤسسة للمصادقة. أكِّد نوع المستخدم لضبط تطبيق OAuth.

ملحق: تفويض حساب الخدمة بدون بروتوكول OAuth

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

إذا كان لواجهة برمجة التطبيقات التي تريد طلبها تعريف خدمة منشور في مستودع Google APIs في GitHub، يمكنك إجراء اتصالات واجهة برمجة التطبيقات المعتمدة باستخدام JWT بدلاً من رمز الدخول. ولإجراء ذلك، يُرجى اتّباع الخطوات التالية:

  1. أنشئ حساب خدمة كما هو موضّح أعلاه. تأكد من ملف JSON الذي تحصل عليه عند إنشاء الحساب.
  2. استخدام أي مكتبة JWT قياسية، مثل المكتبة الموجودة في jwt.io، إنشاء JWT مع عنوان والحمولة كما في المثال التالي:
    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "abcdef1234567890"
    }
    .
    {
      "iss": "123456-compute@developer.gserviceaccount.com",
      "sub": "123456-compute@developer.gserviceaccount.com",
      "aud": "https://firestore.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600
    }
    • بالنسبة إلى الحقل kid في العنوان، حدِّد المفتاح الخاص لحساب الخدمة. رقم التعريف يمكنك العثور على هذه القيمة في الحقل private_key_id ضمن حساب الخدمة. بتنسيق JSON.
    • في الحقلين iss وsub، حدِّد البريد الإلكتروني لحساب الخدمة. الخاص بك. يمكنك العثور على هذه القيمة في حقل client_email الخاص بخدمتك. لملف JSON للحساب.
    • بالنسبة إلى الحقل aud، حدِّد نقطة نهاية واجهة برمجة التطبيقات. مثل: https://SERVICE.googleapis.com/
    • في الحقل iat، حدِّد وقت Unix الحالي، exp، لتحديد الوقت بعد 3600 ثانية بالضبط، وهو الوقت الذي تنتهي صلاحيته.

وقِّع JWT باستخدام RSA-256 باستخدام المفتاح الخاص في ملف JSON لحساب الخدمة.

على سبيل المثال:

Java

استخدام google-api-java-client و java-jwt:

GoogleCredential credential =
        GoogleCredential.fromStream(new FileInputStream("MyProject-1234.json"));
PrivateKey privateKey = credential.getServiceAccountPrivateKey();
String privateKeyId = credential.getServiceAccountPrivateKeyId();

long now = System.currentTimeMillis();

try {
    Algorithm algorithm = Algorithm.RSA256(null, privateKey);
    String signedJwt = JWT.create()
        .withKeyId(privateKeyId)
        .withIssuer("123456-compute@developer.gserviceaccount.com")
        .withSubject("123456-compute@developer.gserviceaccount.com")
        .withAudience("https://firestore.googleapis.com/")
        .withIssuedAt(new Date(now))
        .withExpiresAt(new Date(now + 3600 * 1000L))
        .sign(algorithm);
} catch ...

Python

باستخدام PyJWT:

iat = time.time()
exp = iat + 3600
payload = {'iss': '123456-compute@developer.gserviceaccount.com',
           'sub': '123456-compute@developer.gserviceaccount.com',
           'aud': 'https://firestore.googleapis.com/',
           'iat': iat,
           'exp': exp}
additional_headers = {'kid': PRIVATE_KEY_ID_FROM_JSON}
signed_jwt = jwt.encode(payload, PRIVATE_KEY_FROM_JSON, headers=additional_headers,
                       algorithm='RS256')
  1. يمكنك طلب واجهة برمجة التطبيقات، باستخدام JWT المُوقَّع كرمز الحامل المميز:
    GET /v1/projects/abc/databases/123/indexes HTTP/1.1
    Authorization: Bearer SIGNED_JWT
    Host: firestore.googleapis.com

تطبيق ميزة "الحماية العابرة للحساب"

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

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

  • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
  • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
  • https://schemas.openid.net/secevent/risc/event-type/account-disabled

يمكنك الاطّلاع على حماية حسابات المستخدمين باستخدام صفحة "الحماية العابرة للحساب" للحصول على مزيد من المعلومات حول كيفية تفعيل ميزة "الحماية العابرة للحساب" والاطّلاع على قائمة كاملة بالأحداث المتاحة.