SSO 로그인이 작동하지 않는 것 같습니다

몇 년 동안 내 사이트에서 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);
									}
								});
						}

무엇이 잘못되고 있는지 이해하는 데 도움이 되기를 바랍니다.

이 문제는 이번 달에 출시된 Chrome 97의 버그로 인해 발생했을 가능성이 가장 높습니다. Google이 수정 사항을 배포할 때까지 기다리는 동안, Discourse에 임시 해결책을 추가했습니다. 사이트를 최신 버전으로 업그레이드하면 문제가 해결될 것입니다.

3개의 좋아요

불행히도 호스팅 제공업체를 사용 중입니다. 다른 우회 방법이 있을까요? 일단 Discourse에서 SSO를 끄고, 문제가 수정되면 다시 켜는 방식이 괜찮을까요? 그렇게 하면 문제가 생길까요? 그 경우 사용자가 수동으로 계정을 생성해야 한다고 생각하는데, SSO를 다시 활성화했을 때 기존 시스템과 연결된 새 계정이 생성되는지 궁금합니다.

아쉽게도 그렇지 않습니다. 저희의 관리형 discourse.org 호스팅은 최신 상태로 유지되고 있습니다. 어떤 제공업체를 사용 중이신지 공유해 주실 수 있을까요? 연락하여 업데이트에 대해 알려드릴 수 있을지도 모릅니다.

이메일 주소가 일치한다면 원활하게 작동해야 합니다. 처음에는 사용자가 “비밀번호 찾기” 버튼을 사용하여 비밀번호를 생성해야 합니다.

1개의 좋아요

@jeffbonasso 현재 저희 서비스를 이용하고 계시는 것 같아, 해결책을 찾아보겠습니다. 이 주제를 참조하여 제발 콘솔 패널을 통해 티켓을 생성해 주시겠어요?

아니요, 그렇게 하시면 됩니다. 다시 켜면 SSO가 이메일 주소를 인식할 것입니다.
다만 기존 사용자들은 포럼에 직접 비밀번호가 없기 때문에 로그인하는 데 어려움을 겪을 수 있습니다.

@david 여쭙고 싶은 것이 있는데, 해당 수정 사항이 포함된 Discourse 커밋은 어느 것인가요?

1개의 좋아요

안정(stable) 브랜치의 경우, 수정 사항은 다음과 같습니다:

beta 및 tests-passed 브랜치에도 유사한 커밋이 있습니다.

2개의 좋아요

데이비드, 감사합니다.

해당 수정 사항은 이미 1월 13일부터 @jeffbonasso 님의 포럼에 존재하므로, 이것이 원인일 수는 없습니다(혹은 보고받은 오류들이 그 이전 날짜의 것인가요?).

1개의 좋아요

제가 만든 영상은 오늘 아침에 생성한 테스트 사용자로 촬영한 것이며, 고객들이 경험한 현상과 일치했습니다. 흥미롭게도 방금 Safari로 로그인해 보니 정상적으로 작동했습니다. 그런 다음 다시 Chrome을 시도해 보았는데, 이 역시 이제 정상 작동합니다. 방금 테스트한 Chrome 버전은 97.0.4692.99 (공식 빌드) (x86_64)입니다. 문제가 있었던 고객에게 연락하여 여전히 문제가 있는지 확인해 보겠습니다.

2개의 좋아요

참고로… 고객이 Chrome 기반 브라우저인 Brave를 사용 중이라고 보고했습니다. 그는 여전히 작동하지 않는다고 했으며, 이후 Edge를 시도했는데 정상적으로 작동했습니다.

우리의 우회 방식은 크롬 전용이며, 여기서 네트워킹을 확장할 필요가 있을 수 있습니다 @Falco / @david

이러한 문제를 겪는 사용자들이 켤 수 있도록 서비스 워커를 비활성화하는 사이트 설정을 추가해야 한다고 생각합니다.

이미 2022-01-19T03:00:00Z 이후 최신 크롬 버전에서 수정되었으므로, 이 수정 사항이 포함된 릴리스 97.0.4692.99에는 중대한 보안 수정 1건과 고위험 보안 수정 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개의 좋아요