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 |
للمزيد
- Authentik Docs docs.goauthentik.io
- Outline OIDC getoutline.com/developers/oidc
- OIDC Spec openid.net
- Awesome Authentik github.com/goauthentik/authentik