J’ai une intégration SSO sur mon site depuis quelques années maintenant, sans problème.
Récemment, les utilisateurs ont commencé à dire que lorsqu’ils se connectent, cela les redirige vers mon site pour se connecter, puis revient à Discourse, leur indiquant toujours qu’ils doivent se connecter. J’ai essayé de déboguer, mais je ne vois aucun problème. Il semble simplement qu’à la fin, lorsque la redirection vers la connexion s’effectue, quelque chose ne va pas.
Lorsque je regarde dans Discourse, le compte utilisateur est créé, mais pour une raison quelconque, il ne les connecte pas.
Voici une courte vidéo montrant ce que je vois…
J’ai suivi ces informations :
…et j’utilise la dernière bibliothèque JavaScript discourse-sso.
Voici mon AWS Lambda, qui est fronté par une API Gateway…
'use strict';
exports.handler = (event, context, callback) => {
console.log(event);
var discourse_sso = require('discourse-sso');
var sso = new discourse_sso("********************"); // secret caché
var body = JSON.parse(event.body);
var payload = body.sso; // récupérer de la requête entrante
var sig = body.sig; // récupérer de la requête entrante
if(sso.validate(payload, sig)) {
var nonce = sso.getNonce(payload);
var userparams = {
// Requis, sinon une exception sera levée
"nonce": nonce,
"external_id": body.externalId,
"email": body.email,
// Optionnel
"username": body.username,
"name": body.name
};
console.log("User: " + JSON.stringify(userparams));
var q = sso.buildLoginString(userparams);
console.log("q: " + q);
// Redirection
var response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"q":q})
};
callback(null, response);
} else {
// Que faire si la validation échoue ?
var responseError = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"error":"Erreur de validation SSO"})
};
callback(null, responseError);
}
};
Lorsque le bouton Connexion est cliqué depuis Discourse, il appelle mon application web où l’utilisateur est validé, puis si la validation réussit, il appelle ce qui suit…
if (state.get(["appState", "urlParams", "sso"]) && state.get(["appState", "urlParams", "sig"])) {
var userMetadata = getUserMetadata(result);
var body = {
sso: state.get(["appState", "urlParams", "sso"]),
sig: state.get(["appState", "urlParams", "sig"]),
externalId: keyPrefix,
email: userMetadata.email,
name: userMetadata.name,
username: username
};
request
.post('https://**********.execute-api.us-east-1.amazonaws.com/prod/discourse-sso')
.send(body)
.end(function (err, res) {
if (err || !res.ok) {
alert(err.message);
} else {
window.location.replace("https://forum.miralouaero.com/session/sso_login?" + res.body.q);
}
});
}
Toute aide pour comprendre ce qui pourrait se passer serait appréciée.