نحن نستخدم Firebase كمزود خارجي لتسجيل الدخول الموحد (SSO). لقد اتبعنا تعليمات Discourse المتعلقة بذلك.
نحصل على خطأ في السجلات على النحو التالي:
سجل SSO التفصيلي: بدأ عملية SSO
add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: external_id: groups: locale: locale_force_update: logo
سجل SSO التفصيلي: انتهت صلاحية الـ Nonce بالفعل
add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: [البريد الإلكتروني الفعلي]: external_id: [المعرف الخارجي]
كما نلاحظ في سجلات Discourse:
سجل SSO التفصيلي: بدأت عملية SSO
add_groups:
admin:
moderator:
avatar_force_update:
avatar_url:
bio:
card_background_url:
email:
external_id:
groups:
locale:
locale_force_update:
logout:
name:
nonce: 773cb9d08db7007c9fb833e6c5e3a701
profile_background_url:
remove_groups:
require_activation:
return_sso_url: https://discouse-site/session/sso_login
suppress_welcome_message:
title:
username:
website:
location:
وأيضًا:
سجل SSO التفصيلي: انتهت صلاحية الـ Nonce بالفعل
add_groups:
admin:
moderator:
avatar_force_update:
avatar_url:
bio:
card_background_url:
email: [البريد الإلكتروني الفعلي]
external_id: Be06ze0v0YO7I8SArWRoUVsxJ1k1
groups:
locale:
locale_force_update:
logout:
name: [البريد الإلكتروني الفعلي]
nonce: Ym05dVkyVTlOV0kwTTJVeU1UTTVNamN6TnpNd01UbG1aVEJtWkRjMFlqTmtOV1U1TmpJbWNtVjBkWEp1WDNOemIxOTFjbXc5YUhSMGNITWxNMEVsTWtZbE1rWmpiMjF0ZFc1cGRIa3VZbTl2Wnk1aGNIQWxNa1p6WlhOemFXOXVKVEpHYzNOdlgyeHZaMmx1
profile_background_url:
remove_groups:
require_activation:
return_sso_url: https://discouse-site/session/sso_login
suppress_welcome_message:
title:
username: [البريد الإلكتروني الفعلي]
website:
location:
نقدر أي مساعدة من فريق Discourse، حيث أننا حاليًا غير قادرين على استخدام الموقع.
جيمس
pfaffman
(Jay Pfaffman)
2
أنا لست خبيرًا في هذا، لكن غريزتي تقول إن عليك التحقق من صحة ساعتك.
شكرًا على الاقتراح، لكن يبدو أن الساعة ليست هي المشكلة. خادم discourse والخادم الذي يتم منه توليد الـ nonce يعملان على نفس التوقيت.
أشارك معكم الطريقة التي نستخدمها لتوليد عنوان URL لإعادة التوجيه، على أمل أن نسلط المزيد من الضوء على هذه المشكلة:
public String generateSSORedirectURL(String nonce, String email, String uid) {
//توليد حمولة الإرجاع
HashMap<String, String> params = new HashMap<String, String>();
params.put("nonce", nonce);
params.put("external_id",uid);
params.put("email",email);
params.put("username",email);
params.put("require_activation","false");
params.put("name",email);
params.put("return_sso_url","https://discourse-site/session/sso_login");
log.info("params {}", params);
//إعداد حمولة الإرجاع
String encodedParams = params.keySet().stream()
.map(key -> key + "=" + encodeValue(params.get(key)))
.collect(Collectors.joining("&"));
log.info("encoded parameters {}", encodedParams);
String returnPayload = Base64.getEncoder().encodeToString(encodedParams.getBytes());
log.info("return Payload {}", returnPayload);
//حساب توقيع hmacSha256 للحمولة
byte[] hmacSha256 = calcHmacSha256(ssoSecret.getBytes(), returnPayload.getBytes());
log.info("hmacSha256 sig {}", hmacSha256);
String hmacSha265Hex = String.format("%x", new BigInteger(1, hmacSha256));
log.info("hmacSha256, sig in Hex {}", String.format("%x", new BigInteger(1, hmacSha256)));
HashMap<String, String> params2 = new HashMap<String, String>();
params2.put("sig", hmacSha265Hex);
params2.put("sso", returnPayload);
log.info("params2 {}", params);
String encodedParams2 = params2.keySet().stream()
.map(key -> key + "=" + encodeValue(params2.get(key)))
.collect(Collectors.joining("&"));
log.info("encoded parameters {}", encodedParams2);
//بناء وإرجاع سلسلة الاستعلام
String queryString = forumUrl + "session/sso_login?" + encodedParams2;
log.info("queryString {}", queryString);
return queryString;
}
cb-candor
(Colin Bethea)
5
هل تمكنت من حل هذه المشكلة من قبل؟ @James_Hope