التخطي إلى المحتوى الرئيسي

NginxCommunityVersion

المتطلبات الأساسية

يفترض هذا الدليل أن لديك الشروط التالية:

  • خدمة Casdoor تعمل. إذا لم تكن قد قمت بتثبيت خدمة Casdoor بعد، يرجى الرجوع إلى Server Installation أو Try with Docker.
  • إصدار Nginx مفتوح المصدر مع تمكين وحدة ngx_http_auth_request_module في وقت التجميع. إذا كنت لا تعرف كيفية تمكين وحدة ngx_http_auth_request_module، يرجى الرجوع إلى Nginx Module Document.
  • الموقع الذي تريد تمكين المصادقة عليه مُنشر بنجاح على Nginx، مع اسم نطاق مُعد (بدلاً من استخدام عنوان IP)، ويمكن الوصول إليه بشكل طبيعي.
  • أداة OAuth2-Proxy (حاليًا، يتوفر مشروعان شهيران بعدد كبير من النجوم على GitHub، وتحتاج إلى اختيار واحد منهما):
  1. oauth2-proxy/oauth2-proxy (المستخدم في هذه المقالة) GitHub أو Official-Website
  2. vouch/vouch-proxy GitHub

I. تكوين Casdoor

ملاحظة: العمليات في هذه المقالة تعتمد على واجهة المستخدم الرسومية لـ Casdoor في وقت النشر، ولكن قد تتغير واجهة المستخدم الرسومية لـ Casdoor حسب الإصدار. يرجى اتباع المراجع المقدمة في هذه المقالة لتكوين إصدار Casdoor المنشور لديك.

ملاحظة: المفاتيح وكلمات المرور وأسماء المستخدمين وغيرها من المعلومات السرية المذكورة في هذه المقالة هي كلها أمثلة. لأسباب أمنية، يجب عليك استبدالها بمحتوى ذي صلة خاص بك عند النشر.

  1. تسجيل الدخول إلى حساب المسؤول الخاص بك في Casdoor.

  2. في الشريط العلوي، حدد "المصادقة الهوية" > "التطبيقات"، ثم انقر على "إضافة" في صفحة "التطبيقات".

    addApp

  3. أكمل تكوين التطبيق بناءً على معلومات مشروعك. في هذه المقالة، نستخدم "Nginx-Community" كاسم تطبيق مثال.

    ConfigureApp

  4. خذ ملاحظة على قيم حقول "Client ID" و "Client Secret". سيتم استخدامها عند تكوين OAuth2-Proxy لاحقًا. ثم قم بتكوين "Redirect URL" كـ https://project.yourdomain.com/oauth2/callback/.

    RecordInfo

  5. في الشريط العلوي، حدد "إدارة الأذونات Casbin" > "الأدوار"، ثم انقر على "إضافة" في صفحة "الأدوار".

    AddRole

  6. أكمل تكوين الدور بناءً على معلومات مشروعك. في هذه المقالة، نستخدم "nginx_role" كاسم دور مثال.

    ConfigureRole

  7. (اختياري) في الشريط العلوي، حدد "إدارة المستخدمين" > "المستخدمين"، ثم أضف مستخدمين جدد بناءً على احتياجاتك. إذا كان المستخدمون الذين تحتاجهم موجودين بالفعل، يمكنك تخطي هذه الخطوة. في هذه المقالة، نقوم بإنشاء مستخدم مثال يُدعى "user".

  8. عد إلى صفحة "الأدوار" المذكورة في الخطوة 5، قم بتعديل دور nginx_role، وأضف المستخدمين الذين تحتاجهم إلى خيار "المستخدمين المضمنين". في هذه المقالة، نضيف المستخدم المُنشأ مسبقًا builtin/user هنا.

II. تكوين Oauth2-Proxy

ملاحظة: تستخدم هذه المقالة مشروع Oauth2-Proxy كمثال. إذا كنت ترغب في استخدام Vouch بدلاً من Oauth2-Proxy، يرجى الرجوع إلى توثيقهم الرسمي على GitHub.

ملاحظة: تفترض هذه المقالة أن موقعك مُكون بشهادة SSL موثوقة ويسمح فقط بالوصول عبر HTTPS، أو أنك قمت بإعداد إعادة توجيه تلقائية لزوار HTTP إلى HTTPS. هذا يساعد على تعظيم حماية الكوكيز ويمنع القراءة الخبيثة لرموز الدخول. إذا كان يجب الوصول إلى موقعك عبر بروتوكول HTTP غير آمن، يرجى تعديل الأوامر ذات الصلة وفقًا لذلك. للمزيد من المساعدة في النشر عبر HTTP، يرجى الرجوع إلى التوثيق الرسمي لـ Oauth2-Proxy على GitHub.

نصائح: يوفر OAuth2-Proxy طرق نشر متنوعة (مثل تجميع الكود المصدري، التثبيت باستخدام Docker، إلخ). لتسهيل الشرح، تستخدم هذه المقالة "الثنائي المُجمع مسبقًا" للنشر.

  1. انتقل إلى صفحة GitHub Releases وقم بتنزيل الحزمة الثنائية المقابلة لنظام التشغيل وهندسة وحدة المعالجة المركزية الخاصة بك. اعتبارًا من 1 يناير 2024، أحدث إصدار من OAuth-Proxy هو V7.5.1. إذا كنت ترغب في تنزيل الحزمة الثنائية لهذا الإصدار، يمكنك تنفيذ الأمر التالي لنظام لينكس مع AMD64:

    wget -O oauth2-proxy-linux.tar.gz https://github.com/oauth2-proxy/oauth2-proxy/releases/download/v7.5.1/oauth2-proxy-v7.5.1.linux-amd64.tar.gz

    يُنصح بشدة بأن تتحقق من قيمة SHA256SUM المقدمة من الموقع الرسمي على صفحة GitHub Releases بعد تنزيل الحزمة المضغوطة ومقارنتها بقيمة SHA256SUM للحزمة التي قمت بتنزيلها، حرفًا بحرف.

  2. استخرج الحزمة المُنزلة:

    tar -zxvf oauth2-proxy-*.tar.gz
  3. ادخل إلى الدليل المُستخرج:

    cd oauth2-proxy-v7.5.1.linux-amd64
  4. انقل الملف الثنائي المُحصل إلى /usr/local/bin وقم بتكوينه بأذونات التنفيذ. قد تحتاج إلى رفع الأذونات باستخدام sudo حسب وضعك.

    cp ./oauth2-proxy /usr/local/bin
    cd /usr/local/bin
    chmod +x ./oauth2-proxy
  5. اختبر تثبيت البرنامج الثنائي. إذا كان التثبيت ناجحًا، بعد تنفيذ الأمر التالي، يجب أن ترى مخرجات مشابهة لـ oauth2-proxy v7.5.1 (built with go1.21.1).

    cd ~
    oauth2-proxy --version
  6. شغّل oauth2-proxy باستخدام معاملات سطر الأوامر. المعاملات المُعلمة بـ [required] يجب تكوينها وفقًا لوضعك الخاص، بينما المعاملات المُعلمة بـ [optional] يمكن أن تحسن الأداء ولكن يمكن أيضًا إغفالها. لضمان أن يعمل oauth2-proxy في الخلفية، يمكنك استخدام أدوات مراقبة العمليات مثل Screen أو Supervisor أو أدوات الطرفية.

    oauth2-proxy \ 
    --provider=oidc \ #[required] Do not change
    --client-id=abc123456def \ #[required] "Client ID" obtained in step I.4 above
    --client-secret=abc123456def \ #[required] "Client Secret" obtained in step I.4 above
    --oidc-issuer-url=https://auth.yourdomain.com \ #[required] Your Casdoor URL (domain name or public IP)
    --redirect-url=https://project.yourdomain.com/oauth2/callback \ #[required] https://domain-of-the-project-to-protect/oauth2/callback
    --scope=email+profile+groups+openid \ #[required] Obtained from Casdoor: user email, user profile, groups, and login authentication
    --cookie-domain=project.yourdomain.com \ #[required] Domain name of the project you want to protect
    --whitelist-domain=project.yourdomain.com \ #[required] Domain name of the project you want to protect
    --cookie-secret=abc123456def \ #[required] Please generate a random string of numbers and letters and fill it in here
    --email-domain=* \ #[required] List of acceptable user email domains (* means accept all domains). If the user's email suffix is not in this list, a 403 error will be returned even if the login is successful.
    --insecure-oidc-allow-unverified-email=true \ #[required] Whether to accept users with unverified email addresses
    --http-address=http://127.0.0.1:65534 \ #[required] Address that oauth2-proxy listens on. The port number here can be set arbitrarily. Please record the value you set, as it will be needed for configuring Nginx later.
    --cookie-expire=24h0m0s \ #[optional] Cookie expiration time. After this period, users will need to log in again.
    --custom-sign-in-logo=https://cdn.yourdomain.com/pic/proj.png \ #[optional] Icon displayed on the login page. It is recommended to use a rectangular image rather than a square one.
    --session-store-type=redis \ #[optional] Use Redis cache. If you don't need Redis, you can delete this item.
    --redis-connection-url=redis://127.0.0.1:6379/0 \ #[optional] Redis URL. If you don't need Redis, you can delete this item.
    --redis-password=123456 #[optional] Redis connection password. If you don't need Redis or Redis has no password, you can delete this item.

III. تكوين Nginx

ملاحظة: يرجى التأكيد مرة أخرى أن Nginx الخاص بك قد مكّن وحدة ngx_http_auth_request_module عند التجميع والتثبيت من الكود المصدري (أمر التجميع يتضمن --with_http_auth_request_module). إذا كنت لا تعرف كيفية تمكين وحدة ngx_http_auth_request_module، يرجى الرجوع إلى وثيقة وحدة Nginx.

نصائح: Nginx المثبت باستخدام أداة لوحة Baota لا يمكّن هذه الوحدة بشكل افتراضي.

  1. افتح ملف التكوين للموقع الذي قمت بنشره بالفعل وترغب في حمايته، وقم بإجراء التعديلات التالية:

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

    server {
    listen 443 ssl http2;

    include /path/to/ssl.conf;

    # Add the following content
    location ^~ /oauth2/ {
    proxy_pass http://127.0.0.1:65534; # Change this to the "--http-address" configured in step II.6

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;

    proxy_set_header X-Auth-Request-Redirect $request_uri;
    # or, if you are handling multiple domains:
    # proxy_set_header X-Auth-Request-Redirect $scheme://$host$request_uri;
    }
    location = /oauth2/auth {
    proxy_pass http://127.0.0.1:65534; # Change this to the "--http-address" configured in step II.6

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header Content-Length "";
    proxy_pass_request_body off;
    }
    location ^~ / {
    auth_request /oauth2/auth;
    error_page 401 = /oauth2/sign_in;

    auth_request_set $user $upstream_http_x_auth_request_user;
    auth_request_set $email $upstream_http_x_auth_request_email;
    proxy_set_header X-User $user; # Pass the username of the user logged in to your backend service
    proxy_set_header X-Email $email; # Pass the email of the user logged in to your backend service

    auth_request_set $token $upstream_http_x_auth_request_access_token;
    proxy_set_header X-Access-Token $token; # Pass the user's login token to your backend service

    # The following configurations are related to cookie validation for user login
    auth_request_set $auth_cookie $upstream_http_set_cookie;
    add_header Set-Cookie $auth_cookie;

    auth_request_set $auth_cookie_name_upstream_1 $upstream_cookie_auth_cookie_name_1;

    if ($auth_cookie ~* "(; .*)") {
    set $auth_cookie_name_0 $auth_cookie;
    set $auth_cookie_name_1 "auth_cookie_name_1=$auth_cookie_name_upstream_1$1";
    }

    if ($auth_cookie_name_upstream_1) {
    add_header Set-Cookie $auth_cookie_name_0;
    add_header Set-Cookie $auth_cookie_name_1;
    }
    proxy_no_cache $cookie_session;

    # Provide the web page to the user after successful validation

    proxy_pass http://127.0.0.1:8080; # The address where your backend service runs
    # Note: This is not the Casdoor deployment address or the Oauth2-Proxy running address, but the address where your backend service that needs login protection runs.

    # Then add configurations to pass user IP, Connection request headers, etc., to your backend service, for example:
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection upgrade;
    proxy_set_header Accept-Encoding gzip;
    }
    access_log /path/to/access_log.log;
    error_log /path/to/error_log.log;
    }
  2. احفظ الملف وأعد تحميل Nginx الخاص بك.

الاختبار

  • بعد ذلك، يمكنك اختبار تنفيذك.
  • في الظروف العادية، سيمر مستخدموك بالعملية التالية عند تسجيل الدخول إلى خدمتك:
  • افتح الرابط project.yourdomain.com في متصفح -> فقط انظر صفحة تتطلب تسجيل الدخول، تتضمن زرًا باسم "تسجيل الدخول باستخدام OpenID Connect" -> انقر على الزر ويتم تحويلك إلى عنوان Casdoor الخاص بك، حيث سيُطلب منك تسجيل الدخول -> يدخل المستخدمون اسم المستخدم وكلمة المرور، وتقوم Casdoor بالتحقق من بيانات الاعتماد الخاصة بهم -> يتم التحويل التلقائي مرة أخرى إلى رابطك project.yourdomain.com -> يتم الوصول بنجاح إلى خدمتك -> سيُطلب من المستخدمين تسجيل الدخول مرة أخرى عندما ينتهي وقت --cookie-expire الذي قمت بضبطه.

استكشاف الأخطاء وإصلاحها

  • إذا لم يعمل مشروعك كما هو متوقع، يرجى التحقق من صحة تكوين Nginx ومعاملات تكوين Oauth2-Proxy.
  • يمكنك أيضًا الرجوع إلى الوثائق الرسمية لـ Oauth2-Proxy على GitHub.
  • إذا وجدت أي أخطاء في هذا الوثيق، يرجى الشعور بالحرية لطلب التعديلات على GitHub.