| | |
| | | localeOptions: [], |
| | | currentLocale: "zh-CN", |
| | | loginLoading: false, |
| | | passkeyLoading: false, |
| | | mfaLoading: false, |
| | | toolsDialogVisible: false, |
| | | textDialogVisible: false, |
| | |
| | | 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; |
| | |
| | | } |
| | | }); |
| | | }, |
| | | 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 { |