SSO登录似乎已停止工作

我的网站的 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);
									}
								});
						}

任何帮助理解可能发生的事情将不胜感激。

这很可能是由 Chrome 97 中的一个bug 引起的,该版本于本月发布。在等待 Google 推出修复程序的同时,我们在 Discourse 中添加了一个变通方法。将您的网站升级到最新版本应该可以解决该问题。

3 个赞

抱歉,我正在使用托管提供商。还有其他解决方法吗?如果我暂时关闭 Discourse 的 SSO,然后在修复后重新开启,这会造成什么破坏吗?我假设在这种情况下用户将必须手动创建帐户。当我重新启用时,我想知道是否会创建一个与我的系统关联的新帐户。

恐怕没有了。我们托管的 discourse.org 是最新的。您能分享一下您正在使用的提供商吗?我们也许可以联系他们并告知他们有关更新的信息。

如果电子邮件地址匹配,那么它应该可以无缝运行。最初,用户需要使用“忘记密码”按钮来创建密码。

1 个赞

@jeffbonasso 我看到您托管在我们的平台上,我们会为您寻找解决方案。您能否使用我们的控制面板创建一个工单,并引用此主题?

不会,那样可以。如果您重新开启它,SSO 将会识别电子邮件地址。
但是现有用户可能会难以登录,因为他们没有论坛的直接密码。

@david 我可以问一下——哪个 Discourse commit 包含此修复程序?

1 个赞

对于稳定分支,这是修复:

beta 和 tests-passed 分支上也有类似的提交。

2 个赞

谢谢你,大卫,

这个修复程序自1月13日以来已经存在于你的论坛上 @jeffbonasso ,所以不可能是这个原因(或者你收到的报告是在此日期之前的?)

1 个赞

我今天早上创建的测试用户和我创建的视频,其行为与客户遇到的情况一致。有趣的是,我刚用 Safari 登录了一下,就成功了。然后我又试了试 Chrome,现在也正常工作了。我刚才测试的 Chrome 版本是 97.0.4692.99 (Official Build) (x86_64)。我将联系一位遇到问题的客户,看看他们是否仍然遇到问题。

2 个赞

供您参考……客户报告说他们正在使用 Brave 浏览器,这是 Chrome 的一个衍生版本。他说它仍然无法工作。然后他尝试了 Edge 浏览器,它就可以工作了。

我们的绕过是 Chrome 特定的,我们可能需要在这里扩展网络 @Falco / @david

我想我们是否应该添加一个站点设置来禁用 service worker,以便在遇到此类问题时用户可以启用它?

2022-01-19T03:00:00Z 起,最新 Chrome 版本已修复此问题,我相信 Chrome 衍生版本也将很快跟进,因为包含此修复的版本 97.0.4692.99 还包含一个关键和 15 个高级安全修复程序。

2 个赞

我们在所有浏览器上应用了 DiscourseConnect 修复。后来的全局修复是 Chrome 特有的,但由于其用户代理字符串,它也应该能针对 Edge/Brave:

Edge:'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'

Brave 似乎 没有自定义默认的 Chrome 用户代理

3 个赞