Ho avuto l’integrazione SSO dal mio sito per alcuni anni senza problemi.
Recentemente gli utenti hanno iniziato a dire che quando accedono, viene reindirizzato al mio sito per l’accesso e poi torna a Discourse mostrando ancora che devono accedere. Ho cercato di eseguire il debug ma non vedo alcun problema. Sembra solo che alla fine, quando esegue il reindirizzamento all’accesso, qualcosa vada storto.
Quando guardo in Discourse, l’account utente viene creato, ma per qualche motivo non li sta effettuando l’accesso.
Ecco un breve video che mostra quello che vedo…
Ho seguito queste informazioni:
…e sto usando la libreria javascript discourse-sso più recente.
Questo è il mio AWS Lambda che è frontato da un API Gateway…
'use strict';
exports.handler = (event, context, callback) => {
console.log(event);
var discourse_sso = require('discourse-sso');
var sso = new discourse_sso("********************"); // segreto nascosto
var body = JSON.parse(event.body);
var payload = body.sso; // recupera dalla richiesta in arrivo
var sig = body.sig; // recupera dalla richiesta in arrivo
if(sso.validate(payload, sig)) {
var nonce = sso.getNonce(payload);
var userparams = {
// Obbligatorio, altrimenti genererà un'eccezione
"nonce": nonce,
"external_id": body.externalId,
"email": body.email,
// Opzionale
"username": body.username,
"name": body.name
};
console.log("User: " + JSON.stringify(userparams));
var q = sso.buildLoginString(userparams);
console.log("q: " + q);
// Reindirizzamento
var response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"q":q})
};
callback(null, response);
} else {
// Cosa fare se non valida?
var responseError = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"error":"SSO Validation Error"})
};
callback(null, responseError);
}
};
Quando si fa clic sul pulsante Accedi da Discourse, chiama la mia web app dove l’utente viene convalidato e poi, se la convalida ha successo, chiama quanto segue…
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);
}
});
}
Qualsiasi aiuto per capire cosa potrebbe succedere sarebbe apprezzato.