몇 년 동안 내 사이트에서 SSO 통합을 문제없이 사용해 왔습니다.
최근에 사용자들이 로그인 시 내 사이트로 리다이렉트되어 로그인한 후, 다시 Discourse로 돌아와도 여전히 로그인이 필요하다고 표시된다고 보고하고 있습니다. 디버깅을 시도해 보고 있지만, 아무런 문제를 발견하지 못했습니다. 단순히 마지막에 로그인으로 리다이렉트할 때 무언가 잘못되는 것처럼 보입니다.
Discourse를 확인해 보면 사용자 계정은 생성되어 있지만, 어떤 이유인지 로그인이 되지 않습니다.
제가 보고 있는 상황을 보여주는 짧은 영상은 다음과 같습니다…
다음 정보를 따랐습니다:
…그리고 최신 discourse-sso 자바스크립트 라이브러리를 사용하고 있습니다.
다음은 API Gateway 앞에 배치된 제 AWS Lambda입니다…
'use strict';
exports.handler = (event, context, callback) => {
console.log(event);
var discourse_sso = require('discourse-sso');
var sso = new discourse_sso("********************"); // secret hidden
var body = JSON.parse(event.body);
var payload = body.sso; // fetch from incoming request
var sig = body.sig; // fetch from incoming request
if(sso.validate(payload, sig)) {
var nonce = sso.getNonce(payload);
var userparams = {
// Required, will throw exception otherwise
"nonce": nonce,
"external_id": body.externalId,
"email": body.email,
// Optional
"username": body.username,
"name": body.name
};
console.log("User: " + JSON.stringify(userparams));
var q = sso.buildLoginString(userparams);
console.log("q: " + q);
// Redirect
var response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"q":q})
};
callback(null, response);
} else {
// What to do if doesn't validate?
var responseError = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({"error":"SSO Validation Error"})
};
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);
}
});
}
무엇이 잘못되고 있는지 이해하는 데 도움이 되기를 바랍니다.