لقد قمت بدمج 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("********************"); // 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);
}
});
}
سأكون ممتنًا لأي مساعدة في فهم ما قد يحدث.