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からログインボタンがクリックされると、私のウェブアプリが呼び出され、ユーザーが検証され、検証が成功すると以下のコードが呼び出されます。

						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を無効にしてから、修正後に再度有効にしても問題は発生しませんか?その場合、ユーザーは手動でアカウントを作成する必要があると思われます。再度有効にした際に、私のシステムに関連付けられた新しいアカウントが作成されるのでしょうか?

残念ながら、ありません。当社のマネージドdiscourse.orgホスティングは最新の状態です。ご利用のプロバイダーを教えていただけますか?連絡してアップデートについてお知らせできるかもしれません。

メールアドレスが一致していれば、シームレスに動作するはずです。最初に、ユーザーは「パスワードをお忘れですか」ボタンを使用してパスワードを作成する必要があります。

「いいね!」 1

@jeffbonasso お客様が弊社でホストされていることを確認いたしました。解決策を探しますので、このトピックを参照して、コントロールパネルからチケットを作成していただけますでしょうか。

いいえ、その方法で問題ありません。再度オンにすると、SSOはメールアドレスを認識します。
ただし、既存のユーザーはフォーラムに直接パスワードを持っていないため、ログインに苦労する可能性があります。

@david 修正が含まれているDiscourseのコミットはどれか教えていただけますでしょうか?

「いいね!」 1

安定版ブランチの修正はこちらです。

ベータ版とテスト済みにも同様のコミットがあります。

「いいね!」 2

デビッドさん、ありがとうございます。

その修正は、1月13日にすでにあなたのフォーラムに適用されています(@jeffbonassoさん、これはそれではないか、あるいはあなたが受け取った報告がそれ以前の日付のものですか?)

「いいね!」 1

私が作成した動画は、今朝作成したテストユーザーのもので、顧客が体験していることと同様の動作でした。興味深いことに、Safariでログインしてみたところ、うまくいきました。その後、Chromeでもう一度試したところ、それも現在機能しています。私がテストしたChromeのバージョンは、バージョン97.0.4692.99(公式ビルド)(x86_64)です。問題が発生していた顧客に連絡して、まだ問題が発生しているかどうかを確認します。

「いいね!」 2

念のためお知らせします。お客様はChrome派生ブラウザであるBraveを使用していると報告しました。まだ動作していないとのことです。その後、Edgeを試したところ、動作しました。

回避策はChrome固有です。ここでネットワークを拡張する必要があるかもしれません @Falco / @david

このような問題が発生した場合にユーザーがオンにできる、サービスワーカーを無効にするサイト設定を追加すべきでしょうか?

これは2022年1月19日の最新のChromeバージョンで既に修正されているため、Chromeの派生バージョンもまもなくこの修正を含むリリースである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