Récemment, il y a eu un besoin de synchroniser les utilisateurs existants avec Discourse en utilisant SSO.
J’ai donc écrit une implémentation Java basée sur l’implémentation PHP officielle ( Sync DiscourseConnect user data with the sync_sso route - developers - Discourse Meta ).
La méthode d’implémentation est très simple, mais elle nécessite l’utilisation de quelques paquets supplémentaires, notamment Apache commons codec et Okhttp.
Apache commons codec est utilisé pour générer la signature numérique, et Okhttp est utilisé pour envoyer des requêtes Http Post.
Configuration des paramètres pertinents
4 paramètres doivent être obtenus à l’avance.
Pour obtenir les 4 paramètres ci-dessous, veuillez vous référer à l’article : Discourse utilise DiscourseConnect pour la synchronisation des données utilisateur
const apiKey = '4fe83002bb5fba8c9a61a65e5b4b0a3cf8233b0e4ccafc85ebd6607abab4651a';
const apiUser = 'system';
const connectSecret = 'jdhb19*Xh3!nu(#k';
Configuration des paramètres SSO
La configuration des paramètres fait référence à la configuration des paramètres de la méthode URL Get.
Notre code Java est le suivant :
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, "?"));
Signature Base64 et numérique
Une fois que vous avez la chaîne URL ci-dessus, il y a 2 étapes à suivre.
La première étape consiste à convertir l’URL obtenue en Base64.
La deuxième étape consiste à signer numériquement la chaîne Base64 obtenue et convertie avec succès. L’algorithme HMAC_SHA_256 est utilisé pour la signature.
Dans le même temps, la clé obtenue à la première étape doit être utilisée comme paramètre pour participer au calcul avec l’algorithme.
String sso= "admin/users/sync_sso";
String sig= new HmacUtils(HmacAlgorithms.HMAC_SHA_256, "55619458534897").hmacHex(ssoPayload);
Une fois les 2 valeurs ci-dessus obtenues, reconstruisez une structure de données JSON.
Une structure de données similaire à celle ci-dessous, puis utilisez-la comme données de paramètre Post :
{
"sso": "P2V4dGVybmFsX2lkPTEmZW1haWw9aW5mbyU0MHZpc2Fmbi5jb20mdXNlcm5hbWU9aW5mby52aXNhZm4mcmVxdWlyZV9hY3RpdmF0aW9uPXRydWU=",
"sig": "403a205a004e37ffab2bf77cc12b2eac352d71820983706d86984eec9821a0c4"
}
Envoi de la requête POST
Vous pouvez utiliser n’importe quel outil qui prend en charge HTTP.
OkHttp est maintenant largement utilisé en Java, nous utiliserons donc OkHttp pour envoyer la requête.
private OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(
MediaType.parse("application/json"), objectMapper.writeValueAsString(syncSSO));
Response response = client.newCall(postRequest(path, body)).execute();
postRequest ci-dessus est une méthode dans laquelle nous construisons la requête en utilisant les paramètres existants.
La méthode est écrite comme suit :
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 tout va bien, le code ci-dessus peut terminer l’appel de synchronisation des données SSO.