Blank white background with no objects or features visible.

تعلن TrueFoundry عن استحواذها على Seldon AI، موسعة بذلك لوحة التحكم الخاصة بها للذكاء الاصطناعي للمؤسسات. البيان الصحفي الكامل →

إضافة OAuth2 إلى دفاتر ملاحظات Jupyter على Kubernetes

TrueFoundry يمكن للمستخدمين نشر دفاتر Jupyter على حساباتهم السحابية الشخصية، مثل AWS أو Azure أو GCP. تتيح لهم هذه الميزة إجراء تجارب التعلم الآلي ومهام التدريب على أجهزتهم الخاصة بسهولة. في البداية، كانت دفاتر الملاحظات المنشورة عبر TrueFoundry مؤمنة باستخدام مجموعة اسم مستخدم وكلمة مرور. ومع ذلك، استجابةً لطلبات العملاء المتزايدة، قمنا بدمج تسجيل الدخول الموحد (Single Sign-On). هذا يعني أنه يمكن للمستخدمين الآن الوصول بسهولة إلى دفاتر الملاحظات الخاصة بهم بنفس بيانات الاعتماد التي يستخدمونها لـ TrueFoundry. تتعمق هذه المدونة في تفاصيل كيفية تنفيذنا لهذه الميزة.

تشغيل دفتر Jupyter على TrueFoundry

دفاتر الملاحظات على TrueFoundry

تستخدم TrueFoundry داخليًا نسخة معدلة من Kubeflow Notebook Controller لتنسيق نشر دفاتر الملاحظات. يوفر المتحكم ميزات متنوعة نستفيد منها، مثل:

  1. مواصفات دفتر الملاحظات المبسطة: واجهات برمجة تطبيقات Kubeflow Notebook بسيطة ويقوم المتحكم بتنسيق إنشاء عمليات نشر دفاتر Jupyter.
  2. الإيقاف التلقائي: يقوم المتحكم بإيقاف دفتر الملاحظات تلقائيًا بعد فترة معينة من عدم النشاط. هذا مفيد للغاية لعملائنا الذين يجرون تجارب على دفاتر ملاحظات مدعومة بأجهزة GPU.
  3. دليل الصفحة الرئيسية الدائم: يتولى المتحكم مهمة إنشاء وحدة تخزين دائمة تحفظ تقدم المستخدم على دفتر الملاحظات عبر الجلسات.
  4. صور أساسية قابلة للتوسيع: يدعم المتحكم مجموعة من صور دفاتر الملاحظات الأساسية لـ Jupyter Notebook و VS Code التي تحتفظ بها TrueFoundry. يمكن للمستخدم توسيع الميزات على صور Docker هذه عن طريق إضافة نص برمجي للتشغيل أو تثبيت مكتبات محددة.

للمعلومة، إليك كيف يبدو كائن Kubeflow Notebook بسيط:

apiVersion: kubeflow.org/v1
kind: Notebook
metadata:
 name: my-notebook
spec:
 template:
   spec:
     containers:
       - name: my-notebook
         image: kubeflownotebookswg/jupyter:master
         args:
           [
             "start.sh",
             "lab",
             "--LabApp.token=''",
             "--LabApp.allow_remote_access='True'",
             "--LabApp.allow_root='True'",
             "--LabApp.ip='*'",
             "--LabApp.base_url=/test/my-notebook/",
             "--port=8888",
             "--no-browser",
           ]

المصادقة الأساسية لدفاتر الملاحظات

قبل تطبيق OAuth2، قدمت TrueFoundry للمستخدمين خيار تعزيز أمان دفاتر الملاحظات العامة الخاصة بهم من خلال دمج المصادقة الأساسية. كانت طبقة الأمان الإضافية هذه حاسمة لضمان أن الأفراد المصرح لهم فقط يمكنهم الوصول إلى المحتوى الحساس لهذه الدفاتر. لتنفيذ هذه الميزة، استخدمت TrueFoundry إمكانيات مكونات WebAssembly (Wasm) الإضافية ضمن وكيل Istio، وتحديداً الـ وكيل Envoy.

Istio، وهي شبكة خدمات مفتوحة المصدر، توفر إطار عمل لإدارة اتصالات الشبكة بين أعباء عمل الخدمة المختلفة. بفضل Istio، تمكنت TrueFoundry من حقن منطق مخصص مباشرة في طبقة الشبكة، والتي تتم إدارتها بواسطة وكيل Envoy. سمح هذا النهج بالتحكم الفعال والأمان لحركة المرور المتدفقة من وإلى دفاتر Jupyter الخاصة بهم. كان المفتاح لتطبيق المصادقة الأساسية هو WasmPlugin، وهي ميزة من ميزات Istio تسهل نشر وحدات WebAssembly داخل وكيل Envoy.

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

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
 name: basic-auth
 namespace: istio-ingress
spec:
 phase: AUTHN
 pluginConfig:
   basic_auth_rules:
     - credentials:
         - user:pass
       hosts: www.example.com
       prefix: /secret/
 selector:
   matchLabels:
     istio: ingressgateway
 url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0

OAuth2 لدفتر الملاحظات

لتطبيق OAuth2 في دفاتر الملاحظات الخاصة بنا، استخدمنا مرشح Envoy، لكن النهج اختلف عن المصادقة الأساسية. على عكس المصادقة الأساسية حيث كان بإمكاننا إدراج WasmPlugin جاهز بسهولة في سلسلة المرشحات، تطلب OAuth2 حلاً أكثر تخصيصًا. لتحقيق ذلك، استخدمنا مرشح HTTP مصممًا خصيصًا لـ OAuth. في TrueFoundry، يتكامل نظام الدخول الموحد (SSO) الخاص بنا مع FusionAuth، ليعمل كمزود OAuth الخاص بنا.

إليك كيف تبدو مواصفات مرشح Envoy – ارجع إلى التعليقات في الملف لمزيد من التفاصيل:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
 name: truefoundry-notebook-tfy-oauth2  # اسم مرشح Envoy
 namespace: auth-test  # مساحة الاسم التي يتم فيها نشر مرشح Envoy
spec:
 workloadSelector:
   labels:
     truefoundry.com/application: truefoundry-notebook  # محدد يستهدف أعباء العمل ذات التسميات المحددة
 configPatches:
 - applyTo: CLUSTER
   match:
     context: SIDECAR_OUTBOUND
   patch:
     العملية: إضافة
     القيمة:
       الاسم: tfy-oauth2  # اسم المجموعة لخدمة مصادقة OAuth2
       النوع: LOGICAL_DNS  # نوع اكتشاف الخدمة (DNS)
       مهلة_الاتصال: 5s  # مهلة لإنشاء اتصال
       سياسة_موازنة_التحميل: ROUND_ROBIN  # سياسة موازنة التحميل
       # إعدادات أخرى لموازنة التحميل
 - يُطبق_على: HTTP_FILTER
   مطابقة:
     السياق: SIDECAR_INBOUND
     المستمع:
       سلسلة_المرشحات:
         المرشح:
           الاسم: "envoy.filters.network.http_connection_manager"
           المرشح_الفرعي:
             الاسم: envoy.filters.http.jwt_authn
   تعديل:
     العملية: إدراج_قبل  # إدراج هذا المرشح قبل مرشح مصادقة JWT
     القيمة:
      الاسم: envoy.filters.http.tfy-oauth  # اسم مرشح OAuth
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2
        تكوين:
          use_refresh_token: false  # ما إذا كان سيتم استخدام رمز تحديث
          pass_through_matcher:
            - name: Authorization
              present_match: true  # مرر إذا كان رأس التفويض موجودًا
          forward_bearer_token: true  # إعادة توجيه رمز الحامل إلى المصدر
          auth_type: BASIC_AUTH  # نوع المصادقة المستخدم
          token_endpoint:
            cluster: tfy-oauth2  # المجموعة لنقطة نهاية الرمز
            uri: <token-endpoint-uri-of-oauth-provider>
            timeout: 5s  # مهلة لنقطة نهاية الرمز
          authorization_endpoint: <authorization-endpoint-uri-of-oauth-provider>
          redirect_uri: https://%REQ(:authority)%/truefoundry-notebook/_auth/callback  # عنوان URI لإعادة التوجيه للاستدعاء العكسي
          redirect_path_matcher:
            path:
              exact: /truefoundry-notebook/_auth/callback  # المسار لعنوان URI لإعادة التوجيه
          signout_path:
            path:
              exact: /truefoundry-notebook/_auth/signout  # مسار تسجيل الخروج
          credentials:
            client_id: <client-id-for-oauth>
            token_secret:
               # إعدادات لجلب سر الرمز المميز
               # اقرأ المزيد حول كيفية جلب الأسرار هنا:
               # https://www.envoyproxy.io/docs/envoy/latest/configuration/security/secret
            hmac_secret:
               # إعدادات لجلب hmac

عندما يحاول المستخدم الوصول إلى خدمة محمية بواسطة مرشح OAuth2 للمرة الأولى، يتم إعادة توجيهه إلى authorization_endpoint. نقطة النهاية هذه هي عنوان URL لموفر OAuth الخارجي الخاص بنا، والذي، في تطبيقنا، هو نافذة تسجيل الدخول TrueFoundry المستندة إلى FusionAuth. تعد عملية إعادة التوجيه هذه خطوة حاسمة في عملية OAuth، حيث توجه المستخدمين إلى موقع آمن يمكنهم من خلاله المصادقة ومن ثم منح الأذونات اللازمة للوصول إلى الخدمة.

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

يتم تمرير عمليات الوصول اللاحقة إلى الخدمة عبر مرشح HTTP نظرًا لأن ملف تعريف الارتباط (cookie) يقوم بتعيين Authorization كرأس (header) بقيمة JWT. تم تكوين المرشح لتمرير مثل هذه الطلبات (راجع pass_through_matcher في المواصفات). للتحقق من أن JWT هو رمز مميز صالح، نقوم بإنشاء سياسة RequestAuthentication التي ستتحقق مع موفر OAuth:

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
 # ...
spec:
 selector:
   # ...
 jwtRules:
 - issuer: "truefoundry.com"
   fromHeaders:
   - name: Authorization
     prefix: "Bearer "
   audiences:
     - <client-id>
   jwksUri: <oauth-provider-jwks-uri>
   forwardOriginalToken: true

أخيرًا، نضيف سياسة التفويض التي تحدد الطلبات التي سيتم تطبيقها RequestAuthentication نريد تطبيق التفويض على جميع الطلبات على المنفذ 8888:

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: best-notebook-tfy-oauth2
 namespace: auth-test
spec:
 selector:
   matchLabels:
     truefoundry.com/application: best-notebook
 action: DENY
 rules:
 - from:
   - source:
       notRequestPrincipals: ["*"]
   to:
     - operation:
         ports:
           - "8888"

The fastest way to build, govern and scale your AI

Sign Up
Table of Contents

One Gateway for Every LLM, Agent and MCP Server

Book a 30-min with our AI expert

Book a Demo

The fastest way to build, govern and scale your AI

Book Demo
Summarize with
ChatGPT logo by OpenAI
Perplexity AI logo
Blurry red snowflake on white background, symmetrical frosty design with soft edges and abstract shape.

Discover More

November 5, 2025
|
5 min read

توطين البيانات في عصر الذكاء الاصطناعي الوكيل: كيف تمكّن بوابات الذكاء الاصطناعي التوسع السيادي والامتثال

October 5, 2023
|
5 min read

<Webinar> عرض الذكاء الاصطناعي التوليدي للمؤسسات

Best Fine Tuning Tools for Model Training
May 3, 2024
|
5 min read

أفضل 6 أدوات ضبط دقيق لتدريب النماذج في عام 2026

May 25, 2023
|
5 min read

النماذج اللغوية الكبيرة مفتوحة المصدر: تبنّها أو تندثر

July 4, 2026
|
5 min read

تكاملات منصة التعلم الآلي #1: Weights & Biases

Use Cases
Engineering and Product
July 4, 2026
|
5 min read

تكامل Pillar Security مع TrueFoundry

No items found.
July 4, 2026
|
5 min read

التخزين المؤقت الدلالي لنماذج اللغة الكبيرة (LLMs): تقليل التكلفة وزمن الاستجابة بما يتجاوز التخزين المؤقت للبادئات

No items found.
July 4, 2026
|
5 min read

تكاملات أدوات التعلم الآلي #2 DVC لإدارة إصدارات بياناتك

Engineering and Product
Use Cases
July 4, 2026
|
5 min read

دليل للتزويد التلقائي للعقد السحابية

Kubernetes

Recent Blogs

Black left pointing arrow symbol on white background, directional indicator.
Black left pointing arrow symbol on white background, directional indicator.
Take a quick product tour
Start Product Tour
Product Tour