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.