Integro o SSO ao meu site há alguns anos sem problemas.
Recentemente, os usuários começaram a dizer que, ao fazer login, ele redireciona para o meu site para fazer login e, em seguida, volta para o Discourse, ainda mostrando que precisam fazer login. Tenho tentado depurar, mas não estou vendo nenhum problema. Parece que, no final, quando faz o redirecionamento para o login, algo está dando errado.
Quando olho no Discourse, a conta do usuário é criada, mas por algum motivo não está logando eles.
Aqui está um vídeo rápido mostrando o que estou vendo…
Segui estas informações:
…e estou usando a biblioteca javascript discourse-sso mais recente.
Esta é a minha AWS Lambda, que é frontada por um API Gateway…
'use strict';
exports.handler = (event, context, callback) => {
console.log(event);
var discourse_sso = require('discourse-sso');
var sso = new discourse_sso("********************"); // segredo oculto
var body = JSON.parse(event.body);
var payload = body.sso; // buscar da requisição de entrada
var sig = body.sig; // buscar da requisição de entrada
if(sso.validate(payload, sig)) {
var nonce = sso.getNonce(payload);
var userparams = {
// Obrigatório, caso contrário lançará uma exceção
"nonce": nonce,
"external_id": body.externalId,
"email": body.email,
// Opcional
"username": body.username,
"name": body.name
};
console.log("User: " + JSON.stringify(userparams));
var q = sso.buildLoginString(userparams);
console.log("q: " + q);
// Redirecionar
var response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"q":q})
};
callback(null, response);
} else {
// O que fazer se não validar?
var responseError = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"error":"SSO Validation Error"})
};
callback(null, responseError);
}
};
Quando o botão Login é clicado no Discourse, ele chama meu aplicativo web onde o usuário é validado e, em seguida, se a validação for bem-sucedida, chama o seguinte…
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);
}
});
}
Qualquer ajuda para entender o que pode estar acontecendo seria apreciada.