المصادقة والتفويض

يشرح هذا القسم مفاهيم المصادقة والترخيص في ما يتعلق بتنفيذ Fleet Engine. يوضح بالتفصيل الإجراءات التي تحتاج إلى القيام بها لتأمين استدعاءات وظائف Fleet Engine.

يمكنك ضبط الإمكانات التي يقدّمها برنامج Last Mile Fleet Solution من خلال Google Cloud Console. تتطلّب واجهات برمجة التطبيقات وحِزم تطوير البرامج (SDK) هذه استخدام رموز JSON المميّزة للويب (JWT) التي تم توقيعها باستخدام حسابات الخدمة التي تم إنشاؤها من Cloud Console.

نظرة عامة

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

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

مبادئ تصميم المصادقة

يتضمن تدفق مصادقة Fleet Engine مبادئ التصميم التالية.

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

  • ترتبط أدوار إدارة الهوية وإمكانية الوصول بحسابات الخدمة.

  • تفرض JWT قيودًا على الكيانات التي قد يعمل المتصل عليها. يمكن أن تكون هذه مهام محددة أو مركبات توصيل.

  • تحتوي الطلبات المُرسَلة إلى Fleet Engine دائمًا على رمز JWT.

    • ونظرًا لأن JWT ترتبط بحسابات الخدمة، ترتبط الطلبات المرسلة إلى Fleet Engine ضمنيًا بحساب الخدمة المرتبط بـ JWT.
  • لطلب رمز JWT المناسب الذي يمكنك تمريره بعد ذلك إلى Fleet Engine، يجب أولاً طلب الرمز البرمجي الذي يتم تشغيله في بيئة منخفضة الثقة من خلال الرمز الذي يتم تشغيله في بيئة موثوقة تمامًا.

  • تُجري Fleet Engine فحوصات الأمان التالية:

    1. توفِّر أدوار "إدارة الهوية وإمكانية الوصول" المرتبطة بحساب الخدمة التفويض الصحيح للمتصل من أجل إصدار طلب بيانات من واجهة برمجة التطبيقات.

    2. توفر مطالبات JWT التي يتم تمريرها في الطلب التفويض الصحيح للمتصل.

مسار المصادقة

يوضح مخطط التسلسل التالي تفاصيل تدفق المصادقة.

  1. ينشئ مشرف الأسطول حسابات الخدمة.

  2. يعيّن مشرف مجموعة الأجهزة أدوارًا محددة لإدارة الهوية وإمكانية الوصول (IAM) لحسابات الخدمة.

  3. يضبط مشرف مجموعة الأجهزة الخلفية باستخدام حسابات الخدمة.

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

  5. يصدر Fleet Engine رمز JWT لحساب الخدمة ذي الصلة. يحصل تطبيق العميل على JWT.

  6. يستخدم تطبيق العميل JWT للاتصال بـ Fleet Engine لقراءة البيانات أو تعديلها، بناءً على أدوار إدارة الهوية وإمكانية الوصول المعيّنة له أثناء مرحلة الإعداد.

الرسم التخطيطي لتسلسل المصادقة

إعداد المشروع على السحابة الإلكترونية

لإعداد مشروعك على السحابة الإلكترونية، عليك أولاً إنشاء مشروعك ثم إنشاء حسابات الخدمة.

لإنشاء مشروعك على Google Cloud:

  1. أنشِئ مشروعًا على Google Cloud باستخدام Google Cloud Console.
  2. باستخدام واجهة برمجة التطبيقات ولوحة بيانات الخدمات، فعِّل واجهة برمجة تطبيقات الرحلات والتسليمات المحلية.

حسابات الخدمة وأدوار إدارة الهوية وإمكانية الوصول

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

يستخدم حلّ Last Mile Fleet الأدوار التالية:

Roleالوصف
مستخدم موثوق به في تسليم المركبات على Fleet Engine

roles/fleetengine.deliveryTrustedDriver
يمنح الإذن بإنشاء وتعديل مركبات التسليم وتعديلها، بما في ذلك تعديل الموقع الجغرافي لمركبة التسليم وحالة المهمة أو النتيجة. ويتم عادةً إنشاء الرموز المميّزة لهذا الدور من خلال حساب خدمة، وذلك من الأجهزة الجوّالة الخاصة بسائق التوصيل أو من الخوادم الخلفية.
مستخدم غير موثوق به في توصيل الطلبات إلى Fleet Engine

roles/fleetengine.deliveryUntrustedDriver
يمنح الإذن بتعديل الموقع الجغرافي لمركبة التسليم. ويتم عادةً استخدام الرموز المميّزة التي تم استخراجها من خلال حساب خدمة من خلال هذا الدور من الأجهزة الجوّالة الخاصة بسائق التسليم.
مستخدم مستهلك لخدمات توصيل الطلب إلى Fleet Engine

roles/fleetengine.deliveryConsumer
يمنح الإذن للبحث عن المهام باستخدام رقم تعريف التتبّع، وقراءة معلومات المهام بدون تعديلها. ويتم عادةً استخدام الرموز المميّزة التي تم استخراجها من خلال حساب خدمة من خلال متصفّح الويب الخاص بمستهلك خدمة التسليم.
مستخدم متميز لتسليم محرك الأسطول

roles/fleetengine.deliverySuperUser
يمنح الإذن لجميع واجهات برمجة تطبيقات مركبات التسليم والمهام. ويتم عادةً استخدام الرموز المميّزة التي يسكّها حساب خدمة من خلال هذا الدور من خوادمك الخلفية.
قارئ طلبات تسليم المركبات في Fleet Engine

roles/fleetengine.deliveryFleetReader
يمنح الإذن بقراءة مركبات التسليم والمهام والبحث عن المهام باستخدام رقم تعريف تتبّع. ويتم عادةً استخدام الرموز المميّزة التي تم استخراجها من خلال حساب خدمة من خلال متصفّح الويب الخاص بمشغّل مجموعة التسليم.

يمكن للمؤسسات التي تزود سائقي التوصيل بأجهزة تديرها شركة تكنولوجيا المعلومات أن تستفيد من المرونة التي يقدمها دور مستخدم Fleet Engine السائق الموثوق به وتختار دمج بعض أو كل تفاعلات Fleet Engine في تطبيق الأجهزة الجوّالة.

على المؤسسات التي تدعم سياسات "جلب جهازك الخاص" اختيار سلامة دور "مستخدم غير موثوق به في Fleet Engine" والاعتماد فقط على تطبيق الأجهزة الجوّالة لإرسال إشعارات تحديد الموقع الجغرافي للمركبة إلى Fleet Engine. يجب أن تنشأ جميع التفاعلات الأخرى من خوادم الواجهة الخلفية للعميل.

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

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

يمكنك إنشاء حساب خدمة من خلال علامة التبويب IAM & Admin > Service Accounts في Google Cloud Console. من القائمة المنسدلة الدور، حدد Fleet Engine وعيّن أحد الأدوار لحساب الخدمة. من الممارسات الجيدة الإشارة إلى الحساب المرتبط بكل دور. على سبيل المثال، يمكنك تسمية حساب الخدمة باسم ذي معنى.

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

gcloud projects add-iam-policy-binding project-id \
       --member=user:my-user@example.com \
       --role=roles/iam.serviceAccountTokenCreator

حيث my-user@example.com هو البريد الإلكتروني المستخدم للمصادقة باستخدام gcloud (gcloud auth list --format='value(account)').

مكتبة مصادقة محركات مجموعة المركبات

يستخدم Fleet Engine مجموعات JWT لتقييد الوصول إلى واجهات برمجة تطبيقات Fleet Engine. تعمل مكتبة Fleet Engine Auth Library المتاحة على GitHub على تبسيط عملية إنشاء Fleet Engine JWT وتوقيعها بأمان.

توفر المكتبة المزايا التالية:

  • تبسيط عملية إنشاء الرموز المميزة لـ Fleet Engine
  • توفّر آليات توقيع الرموز المميّزة غير استخدام ملفات بيانات الاعتماد (مثل انتحال هوية حساب خدمة).
  • ترفق الرموز المميزة الموقَّعة للطلبات الصادرة التي تم إجراؤها إما من رمز gRPC أو عميل GAPIC.

إنشاء رمز JSON المميّز للويب (JWT) للتفويض

في حال عدم استخدام مكتبة Fleet Engine Auth Library، يجب كتابة ملفات JWT مباشرةً ضمن قاعدة الرموز البرمجية. وهذا يتطلب أن يكون لديك كل من فهم عميق لنظام JWT وكيفية ارتباطها بـ Fleet Engine. ولهذا السبب، ننصحك بشدة بالاستفادة من مكتبة Fleet Engine Auth Library.

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

يحتوي قسم عنوان JWT على الحقول التالية:

الحقلالوصف
alg الخوارزمية التي سيتم استخدامها. `RS256`.
typ تمثّل هذه السمة نوع الرمز المميّز. "JWT".
طفلة رقم تعريف المفتاح الخاص لحساب الخدمة. يمكنك العثور على هذه القيمة في الحقل "private_key_id" ضِمن ملف JSON لحساب الخدمة. تأكَّد من استخدام مفتاح من حساب خدمة بالمستوى الصحيح من الأذونات.

يحتوي قسم مطالبات JWT على الحقول التالية:

الحقلالوصف
iss عنوان البريد الإلكتروني لحساب الخدمة
sub عنوان البريد الإلكتروني لحساب الخدمة
أُود خدمة SERVICE_NAME لحساب الخدمة، وهي في هذه الحالة https://fleetengine.googleapis.com/
Iat الطابع الزمني الذي تم فيه إنشاء الرمز المميّز والمحدّد بالثواني منذ الساعة 00:00:00 بالتوقيت العالمي المنسَّق، في 1 كانون الثاني (يناير) 1970. انتظر 10 دقائق للانحراف. إذا كان الطابع الزمني يقع في فترة بعيدة جدًا في الماضي أو في المستقبل، قد يبلغ الخادم عن خطأ.
exp الطابع الزمني لانتهاء صلاحية الرمز المميّز، والمحدّد بالثواني منذ 1 كانون الثاني (يناير) 1970 في الساعة 00:00:00 بالتوقيت العالمي المتفق عليه (UTC). وتتعذّر معالجة الطلب إذا كان الطابع الزمني بعد أكثر من ساعة واحدة في المستقبل.
authorization ويمكن أن يتضمّن اسم "deliveryvehicleid" أو "trackingid" أو "taskid" أو "taskid" على "مهام Google"، وذلك حسب حالة الاستخدام.

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

مطالبات JWT

يستخدم برنامج Last Mile Fleet Solution مطالبات خاصة. استخدام المطالبات الخاصة يضمن عدم تمكّن أحد سوى العملاء المصرّح لهم من الوصول إلى بياناتهم الخاصة. على سبيل المثال، عندما تُصدر الخلفية رمز JSON المميّز للويب الخاص بسائق التسليم، يجب أن يحتوي هذا الرمز المميّز على المطالبة deliveryvehicleid مع قيمة معرّف مركبة التسليم الخاص به. وبعد ذلك، استنادًا إلى دور السائق، تتيح الرموز المميّزة إمكانية الوصول فقط لرقم تعريف المركبة المحدد وليس أي رقم تعريف عشوائي آخر للمركبة.

يستخدم برنامج Last Mile Fleet Solution المطالبات الخاصة التالية:

  • deliveryvehicleid: يتم استخدامها عند طلب واجهات برمجة تطبيقات لكل مركبة للتسليم.
  • taskid - تُستخدم عند طلب واجهات برمجة تطبيقات لكل مهمة.
  • taskids: يتم الاستخدام عند الاتصال بالرقم BatchCreateTasksAPI. يجب أن تكون هذه المطالبة في شكل صفيف، ويجب أن تحتوي الصفيفة على جميع معرفات المهام اللازمة لإكمال الطلب. لا تضمِّن مطالبات delivervehicleid أو trackingid أو taskid.
  • trackingid - يتم استخدامه عند الاتصال بـ SearchTasksAPI. يجب أن تتطابق المطالبة مع رقم تعريف التتبّع في الطلب. لا تضمِّن مطالبات delivervehicleid أو taskid أو taskids.

يجب أن يحتوي الرمز المميّز أيضًا على المطالبة المناسبة عند طلب واجهات برمجة تطبيقات من خادم الخلفية، ولكن يمكنك استخدام القيمة الخاصة لعلامة النجمة ("*") للمطالبات deliveryvehicleid وtaskid وtrackingid. يمكن أيضًا استخدام علامة النجمة ("*") في المطالبة taskids، ولكن يجب أن تكون العنصر الوحيد في المصفوفة.

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

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

يوضح المثال التالي رمزًا مميزًا لتنفيذ كل مهمة من خادم الخلفية:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskid": "*"
       }
    }

يعرض المثال التالي رمزًا مميزًا لعملية إنشاء مجمّع للمهام من خادم الخلفية:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "taskids": ["*"]
       }
    }

يوضح المثال التالي رمزًا مميزًا لعملية تسليم كل مركبة من خادم الخلفية:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_provider_service_account"
    }
    .
    {
      "iss": "provider@yourgcpproject.iam.gserviceaccount.com",
      "sub": "provider@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "*"
       }
    }

يوضّح المثال التالي رمزًا مميّزًا للعملاء النهائيين:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_consumer_service_account"
    }
    .
    {
      "iss": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "sub": "consumer@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "trackingid": "shipment_12345"
       }
    }

يوضح المثال التالي رمزًا مميزًا لتطبيق برنامج التشغيل:

    {
      "alg": "RS256",
      "typ": "JWT",
      "kid": "private_key_id_of_delivery_driver_service_account"
    }
    .
    {
      "iss": "driver@yourgcpproject.iam.gserviceaccount.com",
      "sub": "driver@yourgcpproject.iam.gserviceaccount.com",
      "aud": "https://fleetengine.googleapis.com/",
      "iat": 1511900000,
      "exp": 1511903600,
      "authorization": {
         "deliveryvehicleid": "driver_12345"
       }
    }
  • بالنسبة إلى الحقل kid في العنوان، حدِّد رقم تعريف المفتاح الخاص لحساب الخدمة. يمكنك العثور على هذه القيمة في الحقل private_key_id ضمن ملف JSON لحساب الخدمة.
  • بالنسبة إلى الحقلَين iss وsub، حدِّد عنوان البريد الإلكتروني لحساب الخدمة. يمكنك العثور على هذه القيمة في الحقل client_email ضمن ملف JSON لحساب الخدمة.
  • بالنسبة إلى الحقل aud، حدِّد https://SERVICE_NAME/.
  • بالنسبة إلى الحقل iat، حدِّد الطابع الزمني لوقت إنشاء الرمز المميّز بالثانية المنقضية منذ 1 كانون الثاني (يناير) 1970 في الساعة 00:00:00 حسب التوقيت العالمي المنسَّق. انتظر 10 دقائق للانحراف. إذا كان الطابع الزمني بعيدًا جدًا في الماضي أو في المستقبل، قد يُبلغ الخادم عن خطأ.
  • بالنسبة إلى الحقل exp، حدِّد الطابع الزمني لانتهاء صلاحية الرمز المميّز، بالثواني منذ 00:00:00 حسب التوقيت العالمي المنسَّق، 1 كانون الثاني (يناير) 1970. القيمة المقترَحة هي iat + 3600.

عند توقيع الرمز المميّز لتمريره إلى جهاز جوّال أو مستخدم نهائي، تأكَّد من استخدام ملف بيانات الاعتماد لدور "سائق التسليم" أو "المستهلك". بخلاف ذلك، سيتمكن الجهاز المحمول أو المستخدم النهائي من تغيير أو عرض المعلومات التي لا ينبغي له الوصول إليها.