feat: make MFA works for CAS login (#2506)

* feat: make MFA works for CAS login

* fix: Reduced code redundancy

* fix: Modified the format of the code.

* fix: fix an error with the 'res' variable

* Update LoginPage.js

* Update LoginPage.js

* Update LoginPage.js

* Update MfaAuthVerifyForm.js

---------

Co-authored-by: hsluoyz <hsluoyz@qq.com>
This commit is contained in:
songjf 2023-11-21 21:35:19 +08:00 committed by GitHub
parent 1a91e7b0f9
commit 23f4684e1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 8 deletions

View File

@ -337,7 +337,7 @@ class LoginPage extends React.Component {
const casParams = Util.getCasParameters(); const casParams = Util.getCasParameters();
values["type"] = this.state.type; values["type"] = this.state.type;
AuthBackend.loginCas(values, casParams).then((res) => { AuthBackend.loginCas(values, casParams).then((res) => {
if (res.status === "ok") { const loginHandler = (res) => {
let msg = "Logged in successfully. "; let msg = "Logged in successfully. ";
if (casParams.service === "") { if (casParams.service === "") {
// If service was not specified, Casdoor must display a message notifying the client that it has successfully initiated a single sign-on session. // If service was not specified, Casdoor must display a message notifying the client that it has successfully initiated a single sign-on session.
@ -351,6 +351,28 @@ class LoginPage extends React.Component {
newUrl.searchParams.append("ticket", st); newUrl.searchParams.append("ticket", st);
window.location.href = newUrl.toString(); window.location.href = newUrl.toString();
} }
};
if (res.status === "ok") {
if (res.data === NextMfa) {
this.setState({
getVerifyTotp: () => {
return (
<MfaAuthVerifyForm
mfaProps={res.data2}
formValues={values}
authParams={casParams}
application={this.getApplicationObj()}
onFail={() => {
Setting.showMessage("error", i18next.t("mfa:Verification failed"));
}}
onSuccess={(res) => loginHandler(res)}
/>);
},
});
} else {
loginHandler(res);
}
} else { } else {
Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`);
} }
@ -361,7 +383,7 @@ class LoginPage extends React.Component {
this.populateOauthValues(values); this.populateOauthValues(values);
AuthBackend.login(values, oAuthParams) AuthBackend.login(values, oAuthParams)
.then((res) => { .then((res) => {
const callback = (res) => { const loginHandler = (res) => {
const responseType = values["type"]; const responseType = values["type"];
if (responseType === "login") { if (responseType === "login") {
@ -396,12 +418,12 @@ class LoginPage extends React.Component {
<MfaAuthVerifyForm <MfaAuthVerifyForm
mfaProps={res.data2} mfaProps={res.data2}
formValues={values} formValues={values}
oAuthParams={oAuthParams} authParams={oAuthParams}
application={this.getApplicationObj()} application={this.getApplicationObj()}
onFail={() => { onFail={() => {
Setting.showMessage("error", i18next.t("mfa:Verification failed")); Setting.showMessage("error", i18next.t("mfa:Verification failed"));
}} }}
onSuccess={(res) => callback(res)} onSuccess={(res) => loginHandler(res)}
/>); />);
}, },
}); });
@ -414,7 +436,7 @@ class LoginPage extends React.Component {
const sub = res.data2; const sub = res.data2;
Setting.goToLink(`/buy-plan/${sub.owner}/${sub.pricing}/result?subscription=${sub.name}`); Setting.goToLink(`/buy-plan/${sub.owner}/${sub.pricing}/result?subscription=${sub.name}`);
} else { } else {
callback(res); loginHandler(res);
} }
} else { } else {
Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("application:Failed to sign in")}: ${res.msg}`);

View File

@ -24,7 +24,7 @@ import MfaVerifyTotpForm from "./MfaVerifyTotpForm";
export const NextMfa = "NextMfa"; export const NextMfa = "NextMfa";
export const RequiredMfa = "RequiredMfa"; export const RequiredMfa = "RequiredMfa";
export function MfaAuthVerifyForm({formValues, oAuthParams, mfaProps, application, onSuccess, onFail}) { export function MfaAuthVerifyForm({formValues, authParams, mfaProps, application, onSuccess, onFail}) {
formValues.password = ""; formValues.password = "";
formValues.username = ""; formValues.username = "";
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
@ -34,7 +34,8 @@ export function MfaAuthVerifyForm({formValues, oAuthParams, mfaProps, applicatio
const verify = ({passcode}) => { const verify = ({passcode}) => {
setLoading(true); setLoading(true);
const values = {...formValues, passcode, mfaType}; const values = {...formValues, passcode, mfaType};
AuthBackend.login(values, oAuthParams).then((res) => { const loginFunction = formValues.type === "cas" ? AuthBackend.loginCas : AuthBackend.login;
loginFunction(values, authParams).then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
onSuccess(res); onSuccess(res);
} else { } else {
@ -49,7 +50,9 @@ export function MfaAuthVerifyForm({formValues, oAuthParams, mfaProps, applicatio
const recover = () => { const recover = () => {
setLoading(true); setLoading(true);
AuthBackend.login({...formValues, recoveryCode}, oAuthParams).then(res => { const values = {...formValues, recoveryCode};
const loginFunction = formValues.type === "cas" ? AuthBackend.loginCas : AuthBackend.login;
loginFunction(values, authParams).then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
onSuccess(res); onSuccess(res);
} else { } else {