数年前から私のサイトで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);
}
});
}
何が起こっているのか理解する上で、どのような助けでもいただけると幸いです。