Proveedor SSO externo pero los registros de Discourse dicen que Ninguno ya ha expirado (¡ayuda!)

Estamos utilizando Firebase como nuestro proveedor externo de SSO. Hemos seguido las instrucciones de Discourse al respecto.

Obtenemos un error en los registros de la siguiente manera:

Registro detallado de SSO: Proceso de SSO iniciado add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: external_id: groups: locale: locale_force_update: logo

Registro detallado de SSO: El nonce ya ha expirado add_groups: admin: moderator: avatar_force_update: avatar_url: bio: card_background_url: email: [correo real]: external_id: [ID externo]

También vemos en los registros de Discourse:

Registro detallado de SSO: Proceso de SSO iniciado

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: 

Y

Registro detallado de SSO: El nonce ya ha expirado

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

Agradeceríamos cualquier ayuda por parte del equipo de Discourse, ya que actualmente no podemos utilizar el sitio.

James

No soy experto en eso, pero mi suposición es que verifiques si tu reloj está correcto.

Gracias por la sugerencia, pero el reloj no parece ser el problema. El servidor de Discourse y el servidor desde el que se genera el nonce están en la misma hora.

Estoy compartiendo la forma en que generamos la URL de retorno, con la esperanza de arrojar más luz sobre este problema:

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

    // Generar el payload de retorno
    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);

    // Preparar el payload de retorno
    String encodedParams = params.keySet().stream()
        .map(key -> key + "=" + encodeValue(params.get(key)))
        .collect(Collectors.joining("&"));
    log.info("parámetros codificados {}", encodedParams);

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

    // Calcular la firma hmacSha256 para el 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 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("parámetros codificados {}", encodedParams2);

    // Construir y devolver la cadena de consulta
    String queryString = forumUrl + "session/sso_login?" + encodedParams2;
    log.info("queryString {}", queryString);

    return queryString;
}

¿Lo lograste alguna vez? @James_Hope