الأعمال الرقمية

SSO Authentik مع Outline: تكوين كامل OIDC 2026

5 دقائق للقراءة

SSO (Single Sign-On) في 2026 ضروري لأي فريق يستخدم 5+ تطبيقات داخلية. Authentik هو حل SSO مفتوح المصدر، أقوى من Keycloak لكن أسهل إدارة. Outline هو wiki/knowledge base جميل ومفتوح المصدر. ربطهما بـ OIDC يعطي تجربة « تسجيل دخول واحد لكل شيء ». هذا الدرس يكمل الإعداد في 8 خطوات.

المتطلبات

  • VPS مع Docker (4 GB RAM موصى)
  • نطاق + subdomains (auth.example.com، wiki.example.com)
  • SSL عبر Let’s Encrypt
  • الوقت المقدر: ساعتان

الخطوة 1 — تثبيت Authentik

# docker-compose.yml لـ Authentik
version: "3.4"
services:
  postgresql:
    image: postgres:18-alpine
    environment:
      POSTGRES_PASSWORD: ${PG_PASS}
      POSTGRES_DB: authentik
    volumes: [database:/var/lib/postgresql/data]
  redis:
    image: redis:alpine
  server:
    image: ghcr.io/goauthentik/server:latest
    command: server
    environment:
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET}
    ports: [9000:9000, 9443:9443]
  worker:
    image: ghcr.io/goauthentik/server:latest
    command: worker
    environment: [...same as server]
volumes:
  database:

# تشغيل:
docker compose up -d
# الوصول: https://auth.example.com (بعد إعداد SSL)

أول دخول إلى Authentik يبدأ wizard للإعداد: حساب admin، تفعيل التشفير، ربط البريد الإلكتروني. اختر Initial Setup، اتبع الخطوات. بعد 5 دقائق، Authentik جاهز للاستخدام.

الخطوة 2 — تثبيت Outline

# docker-compose.yml لـ Outline
services:
  postgres:
    image: postgres:18-alpine
    environment: [POSTGRES_DB: outline, POSTGRES_PASSWORD: outline]
  redis:
    image: redis:alpine
  outline:
    image: outlinewiki/outline:latest
    ports: [3000:3000]
    environment:
      DATABASE_URL: postgres://outline:outline@postgres:5432/outline
      REDIS_URL: redis://redis:6379
      URL: https://wiki.example.com
      SECRET_KEY: ${OUTLINE_SECRET}
      UTILS_SECRET: ${UTILS_SECRET}
      FILE_STORAGE: local
      FILE_STORAGE_LOCAL_ROOT_DIR: /var/lib/outline/data
      OIDC_CLIENT_ID: ${OIDC_CLIENT_ID}
      OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET}
      OIDC_AUTH_URI: https://auth.example.com/application/o/authorize/
      OIDC_TOKEN_URI: https://auth.example.com/application/o/token/
      OIDC_USERINFO_URI: https://auth.example.com/application/o/userinfo/

قيم OIDC_* تُملأ بعد إنشاء التطبيق في Authentik (الخطوة التالية). للبدء، اترك متغيرات OIDC فارغة، Outline يبدأ بـ login محلي. سنفعّل SSO بعد دقائق.

الخطوة 3 — إنشاء Provider في Authentik

# في Authentik Admin:
Applications → Providers → Create → OAuth2/OpenID Provider
  Name: outline-provider
  Authorization flow: default-provider-authorization-explicit-consent
  Client type: Confidential
  Client ID: outline (يولّد آلياً، احفظه)
  Client Secret: ينولّد آلياً، احفظه
  Redirect URIs:
    https://wiki.example.com/auth/oidc.callback
  Signing Key: authentik Self-signed Certificate

الـ Redirect URI حرج: يجب أن يطابق بدقة ما يطلبه Outline. خطأ في حرف = OIDC لا يعمل. Confidential يعني client_secret مطلوب (آمن للـ server-side). Public client للـ SPA فقط، تجنّبه هنا.

الخطوة 4 — إنشاء Application

# في Authentik Admin:
Applications → Applications → Create
  Name: Outline Wiki
  Slug: outline
  Provider: outline-provider (الذي أنشأناه)
  Launch URL: https://wiki.example.com
  Icon: ارفع شعار Outline (اختياري)
  Publisher: Internal

# هذا يجعل Outline يظهر في dashboard مستخدمي Authentik

الـ Application هو الواجهة المستخدم — ما يراه المستخدم في dashboard Authentik. الـ Provider هو التكوين التقني. كل Application يستخدم Provider واحد. للتطبيقات المتعددة (Outline + Vaultwarden + Forgejo)، أنشئ Provider لكل واحد، ثم Application لكل واحد.

الخطوة 5 — تفعيل OIDC في Outline

# أكمل المتغيرات في docker-compose:
environment:
  OIDC_CLIENT_ID: outline-xyz                         # من Authentik
  OIDC_CLIENT_SECRET: secret-from-authentik
  OIDC_AUTH_URI: https://auth.example.com/application/o/authorize/
  OIDC_TOKEN_URI: https://auth.example.com/application/o/token/
  OIDC_USERINFO_URI: https://auth.example.com/application/o/userinfo/
  OIDC_LOGOUT_URI: https://auth.example.com/application/o/outline/end-session/
  OIDC_DISPLAY_NAME: Authentik
  OIDC_SCOPES: "openid profile email"
  OIDC_USERNAME_CLAIM: email

# أعد التشغيل:
docker compose up -d --force-recreate outline

اختبر: زر https://wiki.example.com → اضغط « Continue with Authentik » → يحوّلك إلى Authentik → بعد المصادقة → ترجع إلى Outline مسجّل دخول. إن فشل، تحقق من logs Outline (docker compose logs outline) — غالباً Redirect URI غير متطابق أو Client Secret خاطئ.

الخطوة 6 — تخصيص الصلاحيات

# في Authentik:
Directory → Groups → Create
  Name: wiki-editors
  Members: أضف المستخدمين

# إعداد Mapping (لإرسال الـ groups إلى Outline):
Applications → Providers → outline-provider → Edit
  Property mappings: + scope-openid-profile-email-groups
  أو أنشئ Mapping مخصص لإرسال claim "groups"

Outline يدعم الـ groups من 0.70+. المستخدمون في group wiki-editors في Authentik يصبحون Editors في Outline. المستخدمون في wiki-admins يصبحون Admins. هذا يلغي الحاجة لإدارة الصلاحيات في كل تطبيق منفصل — كلها تأتي من Authentik كمصدر الحقيقة.

الخطوة 7 — 2FA إلزامي عبر Authentik

الـ SSO وحده لا يكفي — Authentik يضيف طبقة 2FA إلزامية لكل التطبيقات بضربة واحدة.

# في Authentik:
Flows → default-authentication-flow → Edit
  أضف Stage: authenticator-validate
  Configuration:
    Required: Yes
    Methods: TOTP, WebAuthn

# الآن كل تطبيق يستخدم Authentik يطلب 2FA تلقائياً
# المستخدم يفعّل 2FA مرة واحدة في Authentik
# يستخدمه عبر Outline، Forgejo، Vaultwarden، إلخ

هذه القوة الحقيقية للـ SSO المركزي: سياسة 2FA واحدة، تنطبق على كل التطبيقات. لا يستطيع موظف « نسيان » تفعيل 2FA على تطبيق واحد. إن كنت تريد سياسة أقوى (مفاتيح أمان YubiKey إلزامية للـ admins)، تطبّق في Authentik، تنطبق على كل التطبيقات.

الخطوة 8 — التطبيقات الأخرى

بعد إنشاء أول تطبيق، إضافة تطبيقات أخرى تستغرق دقائق فقط. هذه قائمة الدعم العام:

التطبيق طريقة الـ SSO
Outline OIDC (الذي أنشأناه)
Forgejo / Gitea OAuth2
Vaultwarden OIDC (في 2024+)
Nextcloud SAML أو OIDC
WordPress OIDC plugin
GitLab OmniAuth (OAuth2)
Grafana OAuth2 generic
# Pattern عام لإضافة تطبيق:
1. أنشئ Provider جديد في Authentik
2. سجّل redirect URI من التطبيق المستهدف
3. انسخ client_id + client_secret
4. أنشئ Application مرتبط
5. في التطبيق المستهدف: أعدّل OIDC settings
   مع نفس الـ URLs:
     auth: https://auth.example.com/application/o/authorize/
     token: https://auth.example.com/application/o/token/
     userinfo: https://auth.example.com/application/o/userinfo/

الـ URLs دائماً متطابقة عبر كل التطبيقات (تختلف فقط في الـ slug للتطبيق المستهدف). هذا يبسّط الإدارة. قائمة شاملة بالتكاملات في Authentik Docs، 100+ تطبيق مدعوم بأمثلة جاهزة.

أخطاء شائعة

المشكلة السبب الحل
« redirect_uri_mismatch » URI لا يطابق تحقق من تطابق دقيق بما فيه slash في النهاية
« invalid_client » Client Secret خاطئ انسخ مرة أخرى من Authentik
المستخدم يدخل لكن ليس admin groups mapping غير مفعّل أضف groups في scopes
SSL cert error self-signed cert Let’s Encrypt على كل subdomain
Authentik بطيء RAM قليل 4 GB RAM حد أدنى
Logout لا يخرج من Authentik OIDC_LOGOUT_URI ناقص أضفه في environment

للمزيد

مقالات ذات صلة

مشاركة