Вход через 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("Пользователь: " + 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);
									}
								});
						}

Буду признателен за любую помощь в понимании того, что может происходить.

Это, скорее всего, вызвано ошибкой в Chrome 97, который был выпущен в этом месяце. Пока мы ждем, когда Google выпустит исправление, мы добавили обходное решение в Discourse. Обновление вашего сайта до последней версии должно решить проблему.

3 лайка

К сожалению, я использую хостинг-провайдера. Есть ли какие-либо другие обходные пути? Если я временно отключу SSO в Discourse, а затем включу его снова после исправления, не возникнет ли при этом проблем? Я предполагаю, что в таком случае пользователям придется вручную создавать учетные записи. Меня просто интересует, что произойдет, когда я снова включу SSO: создастся ли новая учетная запись, связанная с моей системой?

Боюсь, что нет. Наш управляемый хостинг discourse.org актуален. Можете ли вы сообщить, какого провайдера вы используете? Возможно, мы сможем связаться с ними и сообщить об обновлении.

Если адреса электронной почты совпадают, всё должно работать без сбоев. Изначально пользователям потребуется использовать кнопку «Забыли пароль», чтобы создать пароль.

1 лайк

@jeffbonasso Я вижу, что вы размещены у нас, мы поищем для вас решение. Не могли бы вы создать тикет через нашу панель управления, сославшись на эту тему?

Нет, это сработает. Если вы включите его обратно, то SSO распознает адрес электронной почты.
Однако у существующих пользователей могут возникнуть трудности с входом, так как у них нет пароля непосредственно для форума.

@david Могу я спросить — в каком коммите Discourse содержится это исправление?

1 лайк

Для стабильной ветки исправление выглядит так:

Аналогичный коммит также доступен в ветках beta и tests-passed.

2 лайка

Спасибо, Дэвид.

Это исправление уже есть на вашем форуме с 13 января @jeffbonasso, так что это не оно (или ваши сообщения поступили до этой даты?)

1 лайк

Видео, которое я создал, было записано с тестовым пользователем, которого я создал сегодня утром, и поведение соответствовало тому, что испытывал клиент. Интересно, я только что попробовал войти через Safari, и это сработало. Затем я снова попробовал Chrome, и теперь он тоже работает. Версия Chrome, с которой я только что тестировал, — 97.0.4692.99 (официальная сборка) (x86_64). Я свяжусь с клиентом, у которого были проблемы, чтобы узнать, сохраняются ли у них проблемы.

2 лайка

К сведению… Клиент сообщил, что использует браузер Brave, производный от Chrome. Он сказал, что он по-прежнему не работает. Затем он попробовал Edge, и он работает.

Наш обходной путь специфичен для Chrome, возможно, нам нужно расширить сеть здесь, @Falco / @david.

Интересно, стоит ли добавить настройку сайта для отключения сервисных воркеров, которую пользователи смогут включить, если столкнутся с подобными проблемами?

Это уже исправлено в последней версии Chrome с 2022-01-19T03:00:00Z, поэтому я считаю, что производные версии 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 лайка