#
Junjie
22 小时以前 bd6b518aae61608ddc2d82b43ccc283dc95b9c54
src/main/webapp/static/js/login/login.js
@@ -11,6 +11,7 @@
                localeOptions: [],
                currentLocale: "zh-CN",
                loginLoading: false,
                passkeyLoading: false,
                mfaLoading: false,
                toolsDialogVisible: false,
                textDialogVisible: false,
@@ -152,6 +153,33 @@
                    return true;
                });
            },
            handlePasskeyLogin: function () {
                var vm = this;
                if (!window.WCS_WEBAUTHN || !window.WCS_WEBAUTHN.isSupported()) {
                    vm.$message.error(vm.resolvePasskeyErrorMessage({ message: window.isSecureContext ? "not-supported" : "secure-context" }, "login.error.passkeyOptionsFailed", "获取通行密钥登录参数失败"));
                    return;
                }
                vm.passkeyLoading = true;
                ajaxJson({
                    url: baseUrl + "/login/passkey/options.action",
                    data: {
                        mobile: vm.loginForm.mobile
                    },
                    method: "POST",
                    success: function (res) {
                        if (Number(res.code) !== 200) {
                            vm.passkeyLoading = false;
                            vm.$message.error(res.msg || vm.text("login.error.passkeyOptionsFailed", "获取通行密钥登录参数失败"));
                            return;
                        }
                        vm.executePasskeyLogin(res.data || {});
                    },
                    error: function () {
                        vm.passkeyLoading = false;
                        vm.$message.error(vm.text("login.error.passkeyOptionsFailed", "获取通行密钥登录参数失败"));
                    }
                });
            },
            submitLogin: function () {
                var vm = this;
                vm.loginLoading = true;
@@ -250,12 +278,57 @@
                    }
                });
            },
            executePasskeyLogin: function (payload) {
                var vm = this;
                window.WCS_WEBAUTHN.authenticate(payload).then(function (assertion) {
                    ajaxJson({
                        url: baseUrl + "/login/passkey/verify.action",
                        data: {
                            ticket: payload.ticket,
                            credentialId: assertion.credentialId,
                            clientDataJSON: assertion.clientDataJSON,
                            authenticatorData: assertion.authenticatorData,
                            signature: assertion.signature
                        },
                        method: "POST",
                        success: function (res) {
                            if (Number(res.code) === 200) {
                                vm.finishLogin(res.data || {});
                                return;
                            }
                            vm.$message.error(res.msg || vm.text("login.error.passkeyVerifyFailed", "通行密钥验证失败"));
                        },
                        error: function () {
                            vm.$message.error(vm.text("login.error.passkeyVerifyFailed", "通行密钥验证失败"));
                        },
                        complete: function () {
                            vm.passkeyLoading = false;
                        }
                    });
                }).catch(function (err) {
                    vm.passkeyLoading = false;
                    vm.$message.error(vm.resolvePasskeyErrorMessage(err, "login.error.passkeyVerifyFailed", "通行密钥验证失败"));
                });
            },
            finishLogin: function (payload) {
                localStorage.setItem("token", payload.token || "");
                localStorage.setItem("username", payload.username || this.loginForm.mobile || "");
                this.closeMfaDialog();
                window.location.href = "index.html";
            },
            resolvePasskeyErrorMessage: function (err, fallbackKey, fallbackText) {
                var message = err && err.message ? String(err.message) : "";
                if (message === "secure-context") {
                    return this.text("login.passkey.secureContext", "通行密钥仅支持在 HTTPS 或 localhost 环境下使用");
                }
                if (message === "not-supported" || message === "extension-unsupported" || message === "public-key-missing") {
                    return this.text("login.passkey.browserUnsupported", "当前浏览器不支持通行密钥,请使用最新版 Chrome、Edge 或 Safari");
                }
                if (err && err.name === "NotAllowedError") {
                    return this.text(fallbackKey, fallbackText);
                }
                return this.text(fallbackKey, fallbackText);
            },
            openTextDialog: function (title, label, text, tip) {
                var pretty = "";
                try {