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.