صلاحية بيانات اعتماد SSO / تسجيل الخروج القسري

ما هي المدة المتوقعة التي يمكن أن يبقى فيها المستخدم مسجّل الدخول قبل أن يُطلب منه تسجيل الدخول مرة أخرى؟

لقد قمت بتنفيذ دالة تحقق خاصة بي في ملف functions.php، مع التكامل مع إضافة SSO الخاصة بـ WordPress. يبدو أن منطقيا بسيطًا جدًا، لكنني لاحظت للتو أن عضوًا كانت بطاقته الائتمانية مرفوضة (وبالتالي تم إزالة وسم المستخدم الذي يتحقق منه منطقيا) تمكنت من الوصول إلى المنتدى اليوم. عند الفحص الدقيق، تبين أنها سجلت الدخول آخر مرة قبل بضعة أيام، ويبدو أنها لا تزال مسجّلة الدخول. كما أن تاريخ تسجيل دخولها الأخير في WordPress يعود أيضًا لبضعة أيام.

هل من المتوقع أن تظل بيانات اعتمادها المخزنة مؤقتًا تعمل؟ إذا كان الأمر كذلك، فهل توجد طريقة للتحكم في صلاحية الرمز المميز و/أو الاستجابة لـ webhook لإجبارها على تسجيل الخروج؟

شكرًا لك.

يتم التحكم في هذا عبر إعداد الموقع “أقصى عمر للجلسة” (maximum session age) في Discourse. يحدد هذا الإعداد عدد الساعات التي سيظل فيها المستخدمون مسجلين الدخول إلى موقعك. الافتراضي هو 1440 ساعة (60 يومًا). يمكنك تجربة تعيين قيمة أقل. لكن إذا جعلتها منخفضة جدًا، فقد يبدو الأمر للمستخدمين وكأنه خلل.

هذا أمر منطقي. يمكنك تسجيل خروج المستخدمين يدويًا من خلال الانتقال إلى صفحة إدارة Discourse الخاصة بهم والنقر على زر “تسجيل الخروج” الذي ستجده في أعلى يمين الصفحة. خيار آخر للتحكم في هذا هو إضافة بعض الكود إلى موقع WordPress الخاص بك لتسجيل خروج المستخدمين من Discourse عند انتهاء عضويتهم.

شكرًا جزيلاً لك، سيمون. بينما أعتقد أن 60 يومًا فترة طويلة جدًا لسيناريوهاتي (هؤلاء أعضاء مدفوعون، وبالتالي يتوقعون أننا نتحقق من استمرار صفة عضويتهم)، فإنني أتفق معك على أن تقليل المدة كثيرًا قد يكون مرهقًا.

النقطة الأخيرة (إيجاد طريقة لتسجيل خروجهم من Discourse عند انتهاء العضوية) هي ما سأقوم بالبحث فيه. لقد رأيت خيار تسجيل الخروج اليدوي، لكنني أبحث عن أتمتة كل هذا بالكامل، لذا يبدو أن هذا هو المسار الصحيح.

شكرًا مرة أخرى.

هااا… يشير وصف إعداد الموقع إلى (تأكيدي مني):

سيظل المستخدم مسجلًا الدخول لمدة n ساعة منذ آخر زيارة

إذا فهمتُ بشكل صحيح، فهل يمكن أن يظل المستخدم مسجلًا الدخول إلى الأبد طالما أنه يستمر في زيارة الموقع بشكل دوري حتى بعد فقدان بيانات الاعتماد الخاصة به عبر نظام الدخول الموحد (SSO)؟ على سبيل المثال، إذا كان الإعداد مضبوطًا على 72 ساعة، فطالما أنه يستمر في زيارة الموقع كل يوم أو يومين، فسيظل مسجلًا الدخول. هل تفسيري هذا صحيح؟

نعم، هذا صحيح في تجربتي. لا يوجد وقت انتهاء صلاحية مطلق يقوم بتسجيل خروج شخص ما بشكل قسري بعد فترة زمنية محددة.

إذن، هل يعني ذلك أنه إذا ألغى شخص ما عضويتي وأردت التأكد من عدم قدرته على الوصول إلى منتداي، فسيكون عليّ إجباره على تسجيل الخروج (يدويًا أو عبر استدعاء API)؟

نعم، هذه هي التوصية

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

هل توجد آلية غير يدوية — مهما كانت إبداعية — يمكنني من خلالها التأكد من أن المستخدم الذي لم يعد يملك حسابًا صالحًا، أي لا يمكنه تسجيل الدخول، سيتم تسجيل خروجه قسرًا من Discourse؟

يبدو منطقيًا غريبًا أن تقوم آلية SSO بحظر المستخدمين من تسجيل الدخول (مع الاعتراف بأنهم لا يملكون حسابًا صالحًا)، ولكن إذا كانوا يصلون إلى المنتدى بانتظام (أقل من مهلة انتهاء الصلاحية)، فيمكنهم الوصول إلى المنتدى طالما أرادوا حتى أقوم بتسجيل خروجهم يدويًا.

أعتقد أن خيارتي النهائية، ربما، هي كتابة ملحق يقوم باستدعاء واجهة برمجة تطبيقات Discourse لتسجيل خروجهم عند إلغاء اشتراكهم.

منفتح على أي وأفكار هنا. كما تلاحظ، أنا حقًا أريد تجنب القيام بذلك يدويًا :slight_smile:

شكرًا لك.

يمكنك إرسال طلب واجهة برمجة تطبيقات إلى /admin/users/<discourse_user_id>/log_out. تستخدم إضافة WP Discourse هذا المسار لمزامنة تسجيل الخروج من WordPress مع Discourse. يمكنك على الأرجح نسخ معظم الكود من هذه الدالة: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub.

شكرًا جزيلاً لك، سايمون. سألقي نظرة.

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

ربما يمكنني تقبل فكرة أن ووردبريس، وليس ديسكورتس، هو المصدر الموثوق هنا. وهذا قد يشير إلى أن إضافة SSO هي المكان الأنسب لتطبيق بعض المنطق.

أنا فضولي لمعرفة التفكير العام هنا. أود أن أعتقد أن هذا السيناريو معقول (تسجيل الخروج تلقائيًا بعد فترة زمنية معينة أو عند اعتبار حساب ووردبريس “غير صالح”)، أليس كذلك؟

أفكر فقط في الحلول هنا، لأنني أود تجنب الخطوات اليدوية، لكنني أيضًا أود تجنب كتابة الكود إذا أمكن :slight_smile:

نعم، سيتعين معالجة هذا الأمر عبر ووردبريس. أعتقد أنه من المنطقي أن تقوم إضافة WP Discourse بتسجيل خروج المستخدمين من ديسكورش عند حذفهم في ووردبريس، لكنني لست متأكدًا من أن هذا سيحل مشكلتك. افتراضيّ هو أنه عندما تنتهي عضوية مستخدم في موقعك، لا يتم حذف المستخدم من موقع ووردبريس. لمعالجة حالة تسجيل خروج المستخدم من ديسكورش عند انتهاء عضويته، ستحتاج على الأرجح إلى إضافة بعض الكود إلى موقعك يرتبط بأي إجراء يتم تشغيله بواسطة إضافة العضوية عند انتهاء العضوية.

شكرًا لك مجددًا، @simon. نقاطك منطقية، لكن اعتذر إذا استمريت في الحديث لمرة أخرى :slight_smile:

يبدو أن هناك عاملين متداخلين هنا: صحة الحساب (أي ما إذا كان العضو نشطًا) وصحة الرمز في Discourse.

بالنسبة للعامل الأول، أنا أتفق تمامًا على أن WordPress يجب أن يتولى هذا الأمر، وسأقوم بالتحقيق في ذلك مع توفر الوقت.

ومع ذلك، هناك أيضًا مسألة وجود رمز نشط/صالح على جانب Discourse. أفهم أن هذا قد لا يكون أولوية عالية، لكنني أرى بعض المنطق في وجود خيار (ربما يكون معطلًا افتراضيًا) يتضمن إطارًا زمنيًا لـ “فرض تسجيل الدخول”، أي أن رمز تسجيل دخول المستخدم ينتهي بعد x أيام، بغض النظر عما إذا كان قد سجّل الدخول مؤخرًا أم لا.

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

أحاول القيام بذلك عبر رابط ويب، حيث أنني لا أستخدم ووردبريس. هل يجب أن أتمكن من القيام بذلك بشيء مثل هذا؟

https://community.mysite.com/admin/users/100004/log_out

يظهر لي خطأ 404، ولم يتم تسجيل خروج المستخدم.

إذا تمكنت من جعل عنوان URL يعمل، فأنا آمل في إجبار تسجيل الخروج باستخدام أمر curl أو file_get_contents في PHP…

يتطلب الأمر إجراء طلب POST موثّق إلى المسار. يمكنك إعداد ذلك لتسجيل خروج المستخدمين عند النقر على رابط، لكن سيتعين عليك معالجة الطلب على الخادم.

شكرًا لك! تم المصادقة، أليس كذلك؟ أثناء إجراء بعض الأبحاث حول هذا الأمر، يبدو أن المنشور المصادق عليه من PHP يرسل شيئًا مثل هذا المحتوى في الرأس:

'Authorization: OAuth '.$accesstoken;

هناك بعض المؤشرات التي سأواصل البحث عنها.

لكن سيكون رائعًا لو كان لدى شخص ما مقتطف من كود PHP يعمل! المثال في قسم المصادقة في https://docs.discourse.org/ يعيد لي خطأ في الصيغة… انتظر، هذا أمر Unix!

أرحب بأي مؤشرات قد تساعد في حالة PHP!

الرابط من منشوري السابق يجب أن يكون كافيًا لتبدأ: wp-discourse/lib/sso-provider/discourse-sso.php at main · discourse/wp-discourse · GitHub. بافتراض أنك لا تجري الطلب من موقع ووردبريس، ستحتاج إلى إيجاد طريقة أخرى لإجراء طلب wp_remote_post.

أعتقد أنني قريب من الحل باستخدام أوامر PHP بسيطة. الكود أدناه. جاء اختيار اسم المستخدم من هذا المنشور.

أحصل على هذه الاستجابة… هل يعني ذلك شيئًا لأحد؟ يبدو أنها مشكلة تتعلق بإصدار بروتوكول SSL؟

error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version

إليك كودي:

    $url = "https://community.mysite.com/admin/users/100004/log_out";
    $headers = array( 'Api-Key' => 'd412mylongadminkeyaadcd',
    				  'Api-Username' => 'system',
    				  );

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);

[edit: أضفت هذه الأسطر أيضًا، دون تغيير:]
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
[/edit]

	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $data = curl_exec($ch);
    if (curl_errno($ch)) {
        echo curl_error($ch);
    }
    curl_close($ch);

بما أنك تستخدم WordPress، يمكنك تجربة إجراء الطلب باستخدام دالة wp_remote_post. بهذه الطريقة لن تضطر للتعامل مع خيارات curl.

شكرًا لك، لكنني لا أستخدم ووردبريس. أحاول القيام بذلك بلغة PHP في نظام إدارة العضوية الذي قمت ببنائه بنفسي على مدار العقد الماضي.

يبدو أن مكتبة PHP الخاصة بك لم تقبل شهادة HTTPS الخاصة بـ Discourse. يُفضل البحث عن هذا الخطأ عبر Google.