🇨🇳 Sincronización de datos de usuario de DiscourseConnect usando sync_sso [Java] | Sincronizando datos de usuario de DiscourseConnect con sync_sso [Java]

Recientemente, surgió la necesidad de sincronizar usuarios existentes en Discourse utilizando SSO.

Por lo tanto, basándome en la implementación oficial para PHP (Sync DiscourseConnect user data with the sync_sso route - developers - Discourse Meta), he creado una implementación en Java.

El método de implementación es muy simple, pero requiere el uso de algunos paquetes adicionales, principalmente Apache commons codec y Okhttp.

Apache commons codec se utiliza para generar firmas digitales, y Okhttp se utiliza para enviar solicitudes Http Post.

Configuración de parámetros relacionados

Aquí hay 4 parámetros que deben obtenerse con anticipación.

Para obtener los 4 parámetros siguientes, consulte el artículo: Discourse utiliza DiscourseConnect para la sincronización de datos de usuario

const apiKey = '4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a';
const apiUser = 'system';
const connectSecret = 'jdhb19*Xh3!nu(#k';

Configuración de parámetros SSO

La configuración de los parámetros se basa en la configuración de parámetros del método URL Get.

Nuestro código Java es:

            URIBuilder builder = new URIBuilder();
            builder.addParameter("external_id", "1");
            builder.addParameter("email", "info@isharkfly.com");
            builder.addParameter("username", "info.visafn.sso");
            builder.addParameter("add_groups", "bar");
            builder.addParameter("require_activation", "false");
             url = StringUtils.removeStart(builder.build().toString(),"?");
            System.out.println(StringUtils.removeStart(url, "?"));

Base64 y firma digital

Una vez que se obtiene la cadena de URL anterior, debemos realizar 2 pasos más.

El primer paso es convertir la URL obtenida a Base64.

El segundo paso es firmar digitalmente la cadena Base64 obtenida y convertida con éxito. Para la firma, se utiliza el algoritmo HMAC_SHA_256.

Al mismo tiempo, la clave obtenida en el primer paso se utiliza como parámetro para participar en el cálculo junto con el algoritmo.

        String sso= "admin/users/sync_sso";
        String sig= new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897").hmacHex(ssoPayload);

Una vez que se obtienen los 2 valores anteriores, se reconstruye una estructura de datos JSON.

Una estructura de datos similar a la siguiente se utiliza como datos del parámetro Post:

{
    "sso": "P2V4dGVybmFsX2lkPTEmZW1haWw9aW5mbyU0MHZpc2Fmbi5jb20mdXNlcm5hbWU9aW5mby52aXNhZm4mcmVxdWlyZV9hY3RpdmF0aW9uPXRydWU=",
    "sig": "403a205a004e37ffab2bf77cc12b2eac352d71820983706d86984eec9821a0c4"
}

Envío de solicitud POST

Se puede utilizar cualquier herramienta que admita HTTP.

Actualmente, OkHttp es ampliamente utilizado en Java, por lo que utilizaremos OkHttp para enviar la solicitud.

private OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(
                    MediaType.parse("application/json"), objectMapper.writeValueAsString(syncSSO));
            Response response = client.newCall(postRequest(path, body)).execute();

El postRequest anterior es un método en el que construimos la solicitud utilizando los parámetros existentes.

El método está escrito de la siguiente manera:

    public Request postRequest(String path, RequestBody body) {
        HttpUrl.Builder urlBuilder = HttpUrl.parse(site_url + path).newBuilder();
        Request request = new Request.Builder().url(urlBuilder.build().toString())
                .addHeader("api-username", api_username)
                .addHeader("api-key", api_key)
                .post(body)
                .build();
        return request;
    }

Si no hay problemas, el código anterior puede completar la llamada de sincronización de datos SSO.