feat: add multi-factor authentication (MFA) feature (#1800)

* feat: add two-factor authentication interface and api

* merge

* feat: add Two-factor authentication accountItem and two-factor api in frontend

* feat: add basic 2fa setup UI

* rebase

* feat: finish the two-factor authentication

* rebase

* feat: support recover code

* chore: fix eslint error

* feat: support multiple sms account

* fix: client application login

* fix: lint

* Update authz.go

* Update mfa.go

* fix: support phone

* fix: i18n

* fix: i18n

* fix: support preferred mfa methods

---------

Co-authored-by: hsluoyz <hsluoyz@qq.com>
This commit is contained in:
Yaodong Yu
2023-05-05 21:23:59 +08:00
committed by GitHub
parent 5b27f939b8
commit eb39e9e044
51 changed files with 4215 additions and 2776 deletions

View File

@ -0,0 +1,76 @@
// Copyright 2023 The Casdoor Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import * as Setting from "../Setting";
export function MfaSetupInitiate(values) {
const formData = new FormData();
formData.append("owner", values.owner);
formData.append("name", values.name);
formData.append("type", values.type);
return fetch(`${Setting.ServerUrl}/api/mfa/setup/initiate`, {
method: "POST",
credentials: "include",
body: formData,
}).then(res => res.json());
}
export function MfaSetupVerify(values) {
const formData = new FormData();
formData.append("owner", values.owner);
formData.append("name", values.name);
formData.append("type", values.type);
formData.append("passcode", values.passcode);
return fetch(`${Setting.ServerUrl}/api/mfa/setup/verify`, {
method: "POST",
credentials: "include",
body: formData,
}).then(res => res.json());
}
export function MfaSetupEnable(values) {
const formData = new FormData();
formData.append("type", values.type);
formData.append("owner", values.owner);
formData.append("name", values.name);
return fetch(`${Setting.ServerUrl}/api/mfa/setup/enable`, {
method: "POST",
credentials: "include",
body: formData,
}).then(res => res.json());
}
export function DeleteMfa(values) {
const formData = new FormData();
formData.append("id", values.id);
formData.append("owner", values.owner);
formData.append("name", values.name);
return fetch(`${Setting.ServerUrl}/api/delete-mfa`, {
method: "POST",
credentials: "include",
body: formData,
}).then(res => res.json());
}
export function SetPreferredMfa(values) {
const formData = new FormData();
formData.append("id", values.id);
formData.append("owner", values.owner);
formData.append("name", values.name);
return fetch(`${Setting.ServerUrl}/api/set-preferred-mfa`, {
method: "POST",
credentials: "include",
body: formData,
}).then((res) => res.json());
}

View File

@ -203,3 +203,11 @@ export function verifyCode(values) {
},
}).then(res => res.json());
}
export function checkUserPassword(values) {
return fetch(`${Setting.ServerUrl}/api/check-user-password`, {
method: "POST",
credentials: "include",
body: JSON.stringify(values),
}).then(res => res.json());
}