مزود SSO خارجي ولكن سجلات discourse تقول أن None قد انتهت صلاحيتها بالفعل (الرجاء المساعدة!)

نحن نستخدم 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، حيث أننا حاليًا غير قادرين على استخدام الموقع.

جيمس

أنا لست خبيرًا في هذا، لكن غريزتي تقول إن عليك التحقق من صحة ساعتك.

شكرًا على الاقتراح، لكن يبدو أن الساعة ليست هي المشكلة. خادم 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;
}

هل تمكنت من حل هذه المشكلة من قبل؟ @James_Hope