Fournisseur SSO externe mais les journaux de discourse indiquent que None a déjà expiré (aidez-moi !!)

Nous utilisons Firebase comme fournisseur SSO externe. Nous avons suivi les instructions de Discourse à ce sujet.

Nous obtenons une erreur dans les journaux comme suit :

Journal SSO détaillé : Démarrage du processus SSO add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: external_id: groups: locale: locale_force_update: logo

Journal SSO détaillé : Le nonce a déjà expiré add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: [vrai email]: external_id: [id externe]

Nous voyons également dans les journaux de Discourse :

Journal SSO détaillé : Démarrage du processus 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: 

ET

Journal SSO détaillé : Le nonce a déjà expiré

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

Toute aide de l’équipe de Discourse serait appréciée, car nous ne pouvons actuellement pas utiliser le site.

James

Je ne suis pas expert en la matière, mais je suppose qu’il faut vérifier si votre horloge est correcte.

Merci pour la suggestion, mais l’horloge ne semble pas être en cause. Le serveur Discourse et le serveur qui génère le nonce sont synchronisés sur la même heure.

Je partage la méthode que nous utilisons pour générer l’URL de redirection, dans l’espoir d’éclaircir davantage ce problème :

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

    // Générer le contenu de retour
    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);

    // Préparer le contenu de retour
    String encodedParams = params.keySet().stream()
        .map(key -> key + "=" + encodeValue(params.get(key)))
        .collect(Collectors.joining("&"));
    log.info("paramètres encodés {}", encodedParams);

    String returnPayload = Base64.getEncoder().encodeToString(encodedParams.getBytes());
    log.info("return Payload {}", returnPayload);

    // Calculer la signature hmacSha256 pour le contenu
    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 en 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("paramètres encodés {}", encodedParams2);

    // Construire et retourner la chaîne de requête
    String queryString = forumUrl + "session/sso_login?" + encodedParams2;
    log.info("queryString {}", queryString);

    return queryString;
}

Avez-vous fini par trouver une solution ? @James_Hope