> For the complete documentation index, see [llms.txt](https://ayakaleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ayakaleaf-pro.ayaka.space/on-premises/ar/althyeh/overleaf-toolkit/authentication/saml-authentication.md).

# مصادقة SAML

تم تطوير هذه الميزة بواسطة [yu-i-i/overleaf-cep](https://github.com/yu-i-i/overleaf-cep). هنا نقدم بعض المستندات لتهيئتك.

### الإعدادات

داخليًا، تستخدم وحدة SAML في Overleaf [passport-saml](https://github.com/node-saml/passport-saml) المكتبة، وتُمرَّر معظم خيارات التهيئة التالية إلى `passport-saml`. إذا كنت تواجه مشكلات في تهيئة SAML، فمن المفيد قراءة ملف README الخاص بـ `passport-saml` للحصول على فكرة عن التهيئة التي يتوقعها.

متغير البيئة `EXTERNAL_AUTH` مطلوب لتمكين وحدة مصادقة SAML. يحدد متغير البيئة هذا طرق المصادقة الخارجية التي يتم تفعيلها. قيمة هذا المتغير هي قائمة. إذا كانت القائمة تتضمن `saml` فسيتم تفعيل مصادقة SAML.

على سبيل المثال: `EXTERNAL_AUTH=ldap saml`

عند استخدام طريقة مصادقة SAML، يُعاد توجيه المستخدم إلى موقع المصادقة الخاص بمزوّد الهوية (IdP). إذا نجح IdP في مصادقة المستخدم، فسيتم التحقق من قاعدة بيانات مستخدمي Overleaf بحثًا عن سجل يحتوي على `samlIdentifiers` بنية الحقل كما يلي:

```json
samlIdentifiers: [
  {
    externalUserId: "...",
    providerId: "1",
    userIdAttribute: "..."
  }
]
```

يجب أن يكون `externalUserId` يجب أن يطابق قيمة الخاصية المحددة بواسطة `userIdAttribute` في ملف تعريف المستخدم الذي يعيده خادم IdP.

إذا لم يتم العثور على سجل مطابق، تُبحث قاعدة البيانات عن مستخدم يطابق عنوان بريده الإلكتروني الأساسي البريد الإلكتروني الموجود في ملف المستخدم لدى IdP:

* إذا تم العثور على هذا المستخدم، فسيتم تحديث الحقل `hashedPassword` يتم حذف الحقل لتعطيل المصادقة المحلية، ويتم `samlIdentifiers` إضافة الحقل.
* إذا لم يتم العثور على مستخدم مطابق، فسيتم إنشاء مستخدم جديد باستخدام عنوان البريد الإلكتروني و `samlIdentifiers` من ملف تعريف IdP.

**ملاحظة:** حاليًا، يُدعم مزود هوية SAML واحد فقط.  `providerId` الحقل في `samlIdentifiers` مُثبت على `'1'`.

#### متغيرات البيئة

* `OVERLEAF_SAML_IDENTITY_SERVICE_NAME`
  * الاسم المعروض لخدمة الهوية، ويُستخدم في صفحة تسجيل الدخول (الافتراضي: `تسجيل الدخول باستخدام مزود هوية SAML`).
* `OVERLEAF_SAML_USER_ID_FIELD`
  * ستُستخدم قيمة هذه السمة من قِبل Overleaf كمعرّف المستخدم الخارجي، والقيمة الافتراضية هي `nameID`.
* `OVERLEAF_SAML_EMAIL_FIELD`
  * اسم حقل البريد الإلكتروني في ملف تعريف المستخدم، والقيمة الافتراضية هي `nameID`.
* `OVERLEAF_SAML_FIRST_NAME_FIELD`
  * اسم حقل firstName في ملف تعريف المستخدم، والقيمة الافتراضية هي `givenName`.
* `OVERLEAF_SAML_LAST_NAME_FIELD`
  * اسم حقل lastName في ملف تعريف المستخدم، والقيمة الافتراضية هي `lastName`
* `OVERLEAF_SAML_UPDATE_USER_DETAILS_ON_LOGIN`
  * إذا تم تعيينه إلى `true`، يُحدّث حقل المستخدم `last_name` و `الحقل عند تسجيل الدخول، ويعطّل نموذج تفاصيل المستخدم في` الحقل عند تسجيل الدخول، وأوقف نموذج تفاصيل المستخدم في `صفحة مستخدمي LDAP. وإلا، فسيتم جلب التفاصيل فقط عند أول تسجيل دخول.` .
* `OVERLEAF_SAML_ENTRYPOINT` **(مطلوب)**
  * عنوان URL لنقطة الدخول لخدمة هوية SAML.
    * مثال: `https://idp.example.com/simplesaml/saml2/idp/SSOService.php`
    * مثال Azure: `https://login.microsoftonline.com/8b26b46a-6dd3-45c7-a104-f883f4db1f6b/saml2`
* `OVERLEAF_SAML_ISSUER` **(مطلوب)**
  * اسم المُصدِر.
* `OVERLEAF_SAML_AUDIENCE`
  * الجمهور المتوقع لاستجابة SAML، والقيمة الافتراضية هي قيمة `OVERLEAF_SAML_ISSUER`.
* `OVERLEAF_SAML_IDP_CERT` **(مطلوب)**
  * مسار إلى ملف يحتوي على الشهادة العامة لمزوّد الهوية، وتُستخدم للتحقق من توقيعات استجابات SAML الواردة. إذا كان لدى مزود الهوية عدة شهادات توقيع صالحة، فيمكن أن يكون ذلك مصفوفة JSON من مسارات الشهادات.
    * مثال (شهادة واحدة): `/var/lib/overleaf/certs/idp_cert.pem`
    * مثال (شهادات متعددة): `["var/lib/overleaf/certs/idp_cert.pem", "/var/lib/overleaf/certs/idp_cert_old.pem"]`
* `OVERLEAF_SAML_PUBLIC_CERT`
  * مسار إلى ملف يحتوي على شهادة توقيع عامة تُستخدم لإدراجها في طلبات المصادقة حتى يتمكن IdP من التحقق من توقيعات طلب SAML الوارد. وهي مطلوبة عند إعداد [نقطة نهاية البيانات الوصفية](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider) عندما تكون الاستراتيجية مهيأة باستخدام `OVERLEAF_SAML_PRIVATE_KEY`. يمكن توفير مصفوفة JSON من مسارات الشهادات لدعم تدوير الشهادات. عند توفير مصفوفة شهادات، يجب أن يطابق أول إدخال في المصفوفة الشهادة الحالية `OVERLEAF_SAML_PRIVATE_KEY`. يمكن استخدام الإدخالات الإضافية في المصفوفة لنشر الشهادات القادمة إلى مزودي الهوية قبل تغيير `OVERLEAF_SAML_PRIVATE_KEY`.
* `OVERLEAF_SAML_PRIVATE_KEY`
  * مسار إلى ملف يحتوي على مفتاح خاص بتنسيق PEM يطابق `OVERLEAF_SAML_PUBLIC_CERT` ويُستخدم لتوقيع طلبات المصادقة المرسلة بواسطة passport-saml.
* `OVERLEAF_SAML_DECRYPTION_CERT`
  * مسار إلى ملف يحتوي على شهادة عامة، تُستخدم لـ [نقطة نهاية البيانات الوصفية](https://github.com/yu-i-i/overleaf-cep/wiki/Extended-CE:-SAML-Authentication#metadata-for-the-identity-provider).
* `OVERLEAF_SAML_DECRYPTION_PVK`
  * مسار إلى ملف يحتوي على مفتاح خاص يطابق `OVERLEAF_SAML_DECRYPTION_CERT` الذي سيُستخدم لمحاولة فك تشفير أي ادعاءات مشفرة يتم استلامها.
* `OVERLEAF_SAML_SIGNATURE_ALGORITHM`
  * يمكنك اختياريًا تعيين خوارزمية التوقيع لتوقيع الطلبات؛ القيم الصالحة هي 'sha1' (الافتراضي)، و'sha256' (المفضلة)، و'sha512' (الأكثر أمانًا، تحقق مما إذا كان IdP لديك يدعمها).
* `OVERLEAF_SAML_ADDITIONAL_PARAMS`
  * قاموس JSON لمعاملات الاستعلام الإضافية لإضافتها إلى جميع الطلبات.
* `OVERLEAF_SAML_ADDITIONAL_AUTHORIZE_PARAMS`
  * قاموس JSON لمعاملات الاستعلام الإضافية لإضافتها إلى طلبات 'authorize'.
    * مثال: `{"some_key": "some_value"}`
* `OVERLEAF_SAML_IDENTIFIER_FORMAT`
  * تنسيق معرّف الاسم المطلوب من مزود الهوية (الافتراضي: `urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress`). إذا كنت تستخدم `urn:oasis:names:tc:SAML:2.0:nameid-format:persistent`، فتأكد من أن `OVERLEAF_SAML_EMAIL_FIELD` متغير البيئة مُعرّف. إذا `urn:oasis:names:tc:SAML:2.0:nameid-format:transient` مطلوب، فيجب عليك أيضًا تعريف `OVERLEAF_SAML_ID_FIELD` متغير البيئة، والذي يمكن، على سبيل المثال، ضبطه على عنوان البريد الإلكتروني للمستخدم.
* `OVERLEAF_SAML_ACCEPTED_CLOCK_SKEW_MS`
  * الوقت بالملي ثانية للانحراف المقبول بين العميل والخادم عند التحقق من طوابع صلاحية شروط الادعاء OnBefore وNotOnOrAfter. يؤدي ضبطه إلى -1 إلى تعطيل التحقق من هذه الشروط بالكامل. القيمة الافتراضية هي 0.
* `OVERLEAF_SAML_ATTRIBUTE_CONSUMING_SERVICE_INDEX`
  * `AttributeConsumingServiceIndex` سمة تُضاف إلى AuthnRequest لإرشاد IdP إلى مجموعة السمات التي يجب إرفاقها بالاستجابة ([link](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)).
* `OVERLEAF_SAML_AUTHN_CONTEXT`
  * مصفوفة JSON من قيم تنسيق معرّف الاسم لطلب سياق المصادقة. الافتراضي: `["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"]`.
* `OVERLEAF_SAML_FORCE_AUTHN`
  * إذا `true`، يحدد طلب SAML الأولي من مزود الخدمة أن على IdP فرض إعادة مصادقة المستخدم، حتى إذا كان لديه جلسة صالحة.
* `OVERLEAF_SAML_DISABLE_REQUESTED_AUTHN_CONTEXT`
  * إذا `true`، لا تطلب سياق مصادقة محددًا. على سبيل المثال، يمكنك ضبط هذا على `true` للسماح بسياقات إضافية مثل تسجيلات الدخول بدون كلمة مرور (`urn:oasis:names:tc:SAML:2.0:ac:classes:X509`). يعتمد دعم السياقات الإضافية على IdP لديك.
* `OVERLEAF_SAML_AUTHN_REQUEST_BINDING`
  * إذا تم تعيينه إلى `HTTP-POST`، فسيتم طلب المصادقة من IdP عبر ربط HTTP POST، وإلا فالقيمة الافتراضية هي HTTP-Redirect.
* `OVERLEAF_SAML_VALIDATE_IN_RESPONSE_TO`
  * إذا `always`، فسيتم التحقق من InResponseTo في استجابات SAML الواردة.
  * إذا `أبدًا`، فلن يتم التحقق من InResponseTo (الافتراضي).
  * إذا `ifPresent`، فسيتم التحقق من InResponseTo فقط إذا كان موجودًا في استجابة SAML الواردة.
* `OVERLEAF_SAML_WANT_ASSERTIONS_SIGNED` و `OVERLEAF_SAML_WANT_AUTHN_RESPONSE_SIGNED`
  * عند تعيينه إلى `true` (افتراضي)، يتوقع Overleaf أن تكون ادعاءات SAML، وبالمثل استجابة مصادقة SAML كاملة، موقعة من IdP. عندما يكون الخياران كلاهما `false`، يجب أن يكون واحدٌ على الأقل من الادعاءات أو الاستجابة موقَّعًا.
* `OVERLEAF_SAML_REQUEST_ID_EXPIRATION_PERIOD_MS`
  * يحدد وقت انتهاء الصلاحية الذي لن يكون فيه Request ID المُنشأ لطلب SAML صالحًا إذا ظهر في استجابة SAML في حقل `InResponseTo` القيمة الافتراضية: 28800000 (8 ساعات).
* `OVERLEAF_SAML_LOGOUT_URL`
  * العنوان الأساسي الذي تُستدعى إليه طلبات تسجيل الخروج (الافتراضي: `entryPoint`).
    * مثال: `https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php`
* `OVERLEAF_SAML_ADDITIONAL_LOGOUT_PARAMS`
  * قاموس JSON لمعاملات الاستعلام الإضافية لإضافتها إلى طلبات 'logout'.
* `OVERLEAF_SAML_IS_ADMIN_FIELD` و `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`
  * عندما يتم ضبط متغيري البيئة كليهما، تقوم عملية تسجيل الدخول بتحديث `user.isAdmin = true` إذا كان الملف التعريفي الذي يعيده IdP الخاص بـ SAML يحتوي على السمة المحددة بواسطة `OVERLEAF_SAML_IS_ADMIN_FIELD` وكانت قيمتها تطابق إما `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE` أو كانت مصفوفة تحتوي على `OVERLEAF_SAML_IS_ADMIN_FIELD_VALUE`، وإلا `user.isAdmin` يُضبط إلى `false`. إذا لم يتم ضبط أيٍّ من هذين المتغيرين، فستُعيَّن حالة المسؤول فقط إلى `true` أثناء إنشاء مستخدم مسؤول في Launchpad.

**البيانات الوصفية لمزوّد الهوية**

تتضمن النسخة الحالية من Overleaf CE نقطة نهاية لاسترجاع بيانات مزود الخدمة الوصفية: `http://my-overleaf-instance.com/saml/meta`

سيتعين تهيئة مزود الهوية للتعرّف على خادم Overleaf بوصفه "مزود خدمة". راجع وثائق خادم SAML لديك للحصول على تعليمات حول كيفية القيام بذلك.

فيما يلي مثال على بيانات مزود الخدمة الوصفية المناسبة:

<details>

<summary><strong>ol-meta.xml</strong></summary>

```
<?xml version="1.0"?>
<EntityDescriptor xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
                  xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
                  entityID="MyOverleaf"
                  ID="_b508c83b7dda452f5b269383fb391107116f8f57">
  <SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol" AuthnRequestsSigned="true" WantAssertionsSigned="true">
    <KeyDescriptor use="signing">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
    </KeyDescriptor>
    <KeyDescriptor use="encryption">
      <ds:KeyInfo>
        <ds:X509Data>
          <ds:X509Certificate>MII...
[skipped]
</ds:X509Certificate>
        </ds:X509Data>
      </ds:KeyInfo>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes256-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2009/xmlenc11#aes128-gcm"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
      <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/>
    </KeyDescriptor>
    <SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                         Location="https://my-overleaf-instance.com/saml/logout/callback"/>
    <NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</NameIDFormat>
    <AssertionConsumerService index="1"
                              isDefault="true"
                              Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
                              Location="https://my-overleaf-instance.com/saml/login/callback"/>
  </SPSSODescriptor>
</EntityDescriptor>

```

</details>

لاحظ الشهادات، `AssertionConsumerService.Location`, `SingleLogoutService.Location` و `EntityDescriptor.entityID` وقم بضبطها بما يتناسب مع إعدادات IdP لديك، أو أرسل ملف البيانات الوصفية إلى مسؤول IdP.

<details>

<summary><strong>مثال لملف variables.env (الحد الأدنى)</strong></summary>

<pre><code>OVERLEAF_APP_NAME="مثيل Overleaf الخاص بنا"

ENABLED_LINKED_FILE_TYPES=project_file,project_output_file,url

# يفعّل إنشاء الصور المصغرة باستخدام ImageMagick
ENABLE_CONVERSIONS=true

# يعطّل متطلب تأكيد البريد الإلكتروني
EMAIL_CONFIRMATION_DISABLED=true

## Nginx
# NGINX_WORKER_PROCESSES=4
# NGINX_WORKER_CONNECTIONS=768

## يُضبط لـ TLS عبر nginx-proxy
# OVERLEAF_BEHIND_PROXY=true
# OVERLEAF_SECURE_COOKIE=true

OVERLEAF_SITE_URL=http://my-overleaf-instance.com
OVERLEAF_NAV_TITLE=Our Overleaf Instance
# OVERLEAF_HEADER_IMAGE_URL=http://somewhere.com/mylogo.png
OVERLEAF_ADMIN_EMAIL=support@example.com

OVERLEAF_LEFT_FOOTER=[{"text": "تواصل مع فريق الدعم الخاص بك", "url": "mailto:support@example.com"}]
OVERLEAF_RIGHT_FOOTER=[{"text":"مرحبًا، أنا على اليمين", "url":"https://github.com/yu-i-i/overleaf-cep"}]

OVERLEAF_EMAIL_FROM_ADDRESS=team@example.com
OVERLEAF_EMAIL_SMTP_HOST=smtp.example.com
OVERLEAF_EMAIL_SMTP_PORT=587
OVERLEAF_EMAIL_SMTP_SECURE=false
# OVERLEAF_EMAIL_SMTP_USER=
# OVERLEAF_EMAIL_SMTP_PASS=
# OVERLEAF_EMAIL_SMTP_NAME=
OVERLEAF_EMAIL_SMTP_LOGGER=false
OVERLEAF_EMAIL_SMTP_TLS_REJECT_UNAUTH=true
OVERLEAF_EMAIL_SMTP_IGNORE_TLS=false
OVERLEAF_CUSTOM_EMAIL_FOOTER=هذا النظام يُدار بواسطة القسم x

OVERLEAF_PROXY_LEARN=true
NAV_HIDE_POWERED_BY=true

#################
##     SAML    ##
#################

EXTERNAL_AUTH=saml
OVERLEAF_SAML_ISSUER=MyOverleaf
OVERLEAF_SAML_IDENTITY_SERVICE_NAME='تسجيل الدخول باستخدام مزود SAML'
OVERLEAF_SAML_EMAIL_FIELD=البريد الإلكتروني
OVERLEAF_SAML_FIRST_NAME_FIELD=اسم العرض
OVERLEAF_SAML_LAST_NAME_FIELD=اسم العرض
OVERLEAF_SAML_ENTRYPOINT=http://localhost:18000/login/saml/authorize/admin/SAML_Overleaf
<strong>OVERLEAF_SAML_IDP_CERT=/var/lib/overleaf/certs/idp_cert.pem
</strong>OVERLEAF_SAML_SIGNATURE_ALGORITHM=
</code></pre>

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ayakaleaf-pro.ayaka.space/on-premises/ar/althyeh/overleaf-toolkit/authentication/saml-authentication.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
