我的网站的 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("User: " + 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 Validation Error"})
};
callback(null, responseError);
}
};
当 Discourse 中的登录按钮被点击时,它会调用我的 Web 应用程序,在那里用户被验证,然后如果验证通过,则调用以下内容……
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);
}
});
}
任何帮助理解可能发生的事情将不胜感激。