He tenido integración SSO en mi sitio durante algunos años sin problemas.
Recientemente, los usuarios comenzaron a decir que cuando inician sesión, se les redirige a mi sitio para iniciar sesión y luego vuelven a Discourse, todavía mostrando que necesitan iniciar sesión. He estado tratando de depurar, pero no veo ningún problema. Simplemente parece que al final, cuando realiza la redirección para iniciar sesión, algo sale mal.
Cuando miro en Discourse, la cuenta de usuario se crea, pero por alguna razón no los inicia sesión.
Aquí hay un video rápido que muestra lo que estoy viendo…
Seguí esta información:
…y estoy usando la última biblioteca de javascript discourse-sso.
Este es mi AWS Lambda, que está frente a una API Gateway…
'use strict';
exports.handler = (event, context, callback) => {
console.log(event);
var discourse_sso = require('discourse-sso');
var sso = new discourse_sso("********************"); // secreto oculto
var body = JSON.parse(event.body);
var payload = body.sso; // obtener de la solicitud entrante
var sig = body.sig; // obtener de la solicitud entrante
if(sso.validate(payload, sig)) {
var nonce = sso.getNonce(payload);
var userparams = {
// Requerido, de lo contrario lanzará una excepción
"nonce": nonce,
"external_id": body.externalId,
"email": body.email,
// Opcional
"username": body.username,
"name": body.name
};
console.log("Usuario: " + JSON.stringify(userparams));
var q = sso.buildLoginString(userparams);
console.log("q: " + q);
// Redirigir
var response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"q":q})
};
callback(null, response);
} else {
// ¿Qué hacer si no valida?
var responseError = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"error":"Error de validación SSO"})
};
callback(null, responseError);
}
};
Cuando se hace clic en el botón Iniciar sesión desde Discourse, llama a mi aplicación web donde se valida al usuario y luego, si la validación es exitosa, llama a lo siguiente…
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);
}
});
}
Agradecería cualquier ayuda para entender qué podría estar pasando.