Externer SSO-Anbieter, aber Discourse-Logs sagen, dass None bereits abgelaufen ist (bitte helfen Sie!)

Wir verwenden Firebase als unseren externen SSO-Anbieter. Wir haben die Discourse-Anweisungen dazu befolgt.

In den Logs erhalten wir folgenden Fehler:

Verbose SSO log: Started SSO Process add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: external_id: groups: locale: locale_force_update: logo

Verbose SSO log: Nonce has already expired add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: [real email]: external_id: [external id]

In den Discourse-Logs sehen wir zudem:

Verbose SSO log: Started SSO process

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: 

UND

Verbose SSO log: Nonce has already expired

add_groups: 
admin: 
moderator: 
avatar_force_update: 
avatar_url: 
bio: 
card_background_url: 
email: [real email]
external_id: Be06ze0v0YO7I8SArWRoUVsxJ1k1
groups: 
locale: 
locale_force_update: 
logout: 
name: [real email]
nonce: Ym05dVkyVTlOV0kwTTJVeU1UTTVNamN6TnpNd01UbG1aVEJtWkRjMFlqTmtOV1U1TmpJbWNtVjBkWEp1WDNOemIxOTFjbXc5YUhSMGNITWxNMEVsTWtZbE1rWmpiMjF0ZFc1cGRIa3VZbTl2Wnk1aGNIQWxNa1p6WlhOemFXOXVKVEpHYzNOdlgyeHZaMmx1
profile_background_url: 
remove_groups: 
require_activation: 
return_sso_url: https://discouse-site/session/sso_login
suppress_welcome_message: 
title: 
username: [real email]
website: 
location:  

Jede Unterstützung seitens des Discourse-Teams wäre uns eine große Hilfe, da wir die Website derzeit nicht nutzen können.

James

Ich bin kein Experte auf diesem Gebiet, aber meine Vermutung ist, dass du überprüfen solltest, ob deine Uhrzeit korrekt ist.

Danke für den Vorschlag, aber die Uhr scheint nicht das Problem zu sein. Der Discourse-Server und der Server, auf dem der Nonce generiert wird, haben die gleiche Zeit.

Ich teile mit Ihnen die Methode, mit der wir die Rückgabe-URL generieren, in der Hoffnung, dass dies etwas mehr Licht auf das Problem wirft:

   public String generateSSORedirectURL(String nonce, String email, String uid) {

    // Erstellen des Rückgabepayloads
    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);

    // Vorbereiten des Rückgabepayloads
    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);

    // Berechnung der HMAC-SHA256-Signatur für den Payload
    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);

    // Erstellen und Zurückgeben der Abfragezeichenkette
    String queryString = forumUrl + "session/sso_login?" + encodedParams2;
    log.info("queryString {}", queryString);

    return queryString;
}

Hast du das jemals herausgefunden? @James_Hope