У меня уже несколько лет работает интеграция SSO с моего сайта, и проблем не возникало.
Недавно пользователи начали сообщать, что при входе их перенаправляет на мой сайт для авторизации, а затем они снова оказываются в Discourse, где всё ещё отображается сообщение о необходимости входа. Я пытаюсь отладить проблему, но никаких ошибок не обнаруживаю. Похоже, что что-то идёт не так именно на этапе перенаправления для входа.
Когда я проверяю учётную запись пользователя в Discourse, она создаётся, но почему-то вход не выполняется.
Вот короткое видео, демонстрирующее проблему:
Я следовал этой инструкции:
…и использую последнюю версию библиотеки discourse-sso для JavaScript.
Ниже представлен код моей AWS Lambda, перед которой стоит API Gateway:
'use strict';
exports.handler = (event, context, callback) => {
console.log(event);
var discourse_sso = require('discourse-sso');
var sso = new discourse_sso("********************"); // секрет скрыт
var body = JSON.parse(event.body);
var payload = body.sso; // получить из входящего запроса
var sig = body.sig; // получить из входящего запроса
if(sso.validate(payload, sig)) {
var nonce = sso.getNonce(payload);
var userparams = {
// Обязательно, иначе будет выброшено исключение
"nonce": nonce,
"external_id": body.externalId,
"email": body.email,
// Опционально
"username": body.username,
"name": body.name
};
console.log("Пользователь: " + JSON.stringify(userparams));
var q = sso.buildLoginString(userparams);
console.log("q: " + q);
// Перенаправление
var response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"q":q})
};
callback(null, response);
} else {
// Что делать, если валидация не прошла?
var responseError = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"error":"Ошибка валидации SSO"})
};
callback(null, responseError);
}
};
Когда в Discourse нажимается кнопка входа, вызывается мое веб-приложение, где выполняется проверка пользователя. Если проверка успешна, выполняется следующий код:
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);
}
});
}
Буду признателен за любую помощь в понимании того, что может происходить.