From 4f738246fd51d4acd4ed740db020766c3d5da6f2 Mon Sep 17 00:00:00 2001 From: Trojaner Date: Thu, 29 Feb 2024 12:19:26 +0000 Subject: [PATCH] Make security key independent of 2FA Co-authored-by: TrojanerHD --- locales/bul_BG.yml | 2 - locales/ca-ES.yml | 9 ---- locales/de-DE.yml | 9 ---- locales/en-US.yml | 9 ---- locales/es-ES.yml | 9 ---- locales/fr-FR.yml | 9 ---- locales/id-ID.yml | 8 ---- locales/it-IT.yml | 9 ---- locales/ja-JP.yml | 6 --- locales/ko-KR.yml | 6 --- locales/no-NO.yml | 6 --- locales/ru-RU.yml | 9 ---- locales/tr-TR.yml | 9 ---- locales/uk-UA.yml | 9 ---- locales/vi-VN.yml | 8 ---- locales/zh-CN.yml | 6 --- locales/zh-TW.yml | 6 --- .../backend/src/models/repositories/user.ts | 30 ++++++------- .../server/api/endpoints/i/2fa/key-done.ts | 6 +-- .../api/endpoints/i/2fa/register-key.ts | 4 -- .../server/api/endpoints/i/2fa/remove-key.ts | 3 +- .../backend/src/server/api/private/signin.ts | 4 +- packages/client/src/components/MkSignin.vue | 44 ++++++++++--------- packages/client/src/pages/settings/2fa.vue | 32 +------------- 24 files changed, 44 insertions(+), 208 deletions(-) diff --git a/locales/bul_BG.yml b/locales/bul_BG.yml index cd1e04fac4..7f04df7eeb 100644 --- a/locales/bul_BG.yml +++ b/locales/bul_BG.yml @@ -417,8 +417,6 @@ audio: Звук removeQuote: Премахни цитат _sfx: notification: Известия -_2fa: - renewTOTPCancel: Отмяна _permissions: "read:favorites": Виж списъка си с отметки "write:favorites": Редактирай списъка си с отметки diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index 9c2a34dfb2..38a65d2d22 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -335,20 +335,11 @@ _2fa: securityKeyName: Introduïu un nom de clau removeKey: Suprimeix la clau de seguretat removeKeyConfirm: Vols suprimir la clau {name}? - renewTOTP: Tornar a configurar l'aplicació d'autenticació - renewTOTPOk: Reconfigurar - renewTOTPCancel: Cancel·lar step2Click: Fer clic en aquest codi QR us permetrà registrar 2FA a la vostra clau de seguretat o aplicació d'autenticació del telèfon. securityKeyNotSupported: El vostre navegador no admet claus de seguretat. - registerTOTPBeforeKey: Configureu una aplicació d'autenticació per registrar una - clau de seguretat o de passi. tapSecurityKey: Si us plau, seguiu el vostre navegador per registrar la clau de seguretat o d'accés - renewTOTPConfirm: Això farà que els codis de verificació de l'aplicació anterior - deixin de funcionar - whyTOTPOnlyRenew: L’aplicació d’autenticació no es pot eliminar sempre que es hi - hagi una clau de seguretat registrada. token: Token 2FA _widgets: notifications: "Notificacions" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index c2fbbe78c5..53024bf845 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -1402,23 +1402,14 @@ _2fa: deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels einrichten." step3Title: Gib deinen Authentifizierungscode ein - renewTOTPOk: Neu konfigurieren securityKeyNotSupported: Dein Browser unterstützt Hardware-Security-Keys nicht. chromePasskeyNotSupported: Chrome Passkeys werden momentan nicht unterstützt. - renewTOTP: Konfiguriere deine Authenticator App neu - renewTOTPCancel: Abbrechen tapSecurityKey: Bitte folge den Anweisungen deines Browsers, um einen Hardware-Security-Key oder einen Passkey zu registrieren removeKey: Entferne deinen Hardware-Security-Key removeKeyConfirm: Möchtest du wirklich deinen Key mit der Bezeichnung {name} löschen? - renewTOTPConfirm: Das wird dazu führen, dass du Verifizierungscodes deiner vorherigen - Authenticator App nicht mehr nutzen kannst - whyTOTPOnlyRenew: Die Authentificator App kann nicht entfernt werden, solange ein - Hardware-Security-Key registriert ist. step2Click: Ein Klick auf diesen QR-Code erlaubt es dir eine 2FA-Methode zu deinem Security Key oder deiner Authenticator App hinzuzufügen. - registerTOTPBeforeKey: Bitte registriere eine Authentificator App, um einen Hardware-Security-Key - oder einen Passkey zu nutzen. securityKeyName: Gib einen Namen für den Key ein token: 2FA Token _permissions: diff --git a/locales/en-US.yml b/locales/en-US.yml index f54282c713..a3cd68ba0b 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1586,8 +1586,6 @@ _2fa: step3: "Enter the token provided by your app to finish setup." step4: "From now on, any future login attempts will ask for such a login token." securityKeyNotSupported: "Your browser does not support security keys." - registerTOTPBeforeKey: "Please set up an authenticator app to register a security - or pass key." securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup authentication via hardware security keys that support FIDO2 to further secure your account." @@ -1597,13 +1595,6 @@ _2fa: tapSecurityKey: "Please follow your browser to register the security or pass key" removeKey: "Remove security key" removeKeyConfirm: "Really delete the {name} key?" - whyTOTPOnlyRenew: "The authenticator app cannot be removed as long as a security - key is registered." - renewTOTP: "Reconfigure authenticator app" - renewTOTPConfirm: "This will cause verification codes from your previous app to - stop working" - renewTOTPOk: "Reconfigure" - renewTOTPCancel: "Cancel" token: "2FA Token" _permissions: "read:account": "View your account information" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 2e8aad3d4d..328e53a10b 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -1381,21 +1381,12 @@ _2fa: chromePasskeyNotSupported: Contraseñas de Chrome no están soportadas. removeKeyConfirm: ¿Realmente deseas borrar la clave {name}? step3Title: Ingresa un código de autorización - renewTOTP: Reconfigurar la aplicación autorizadora - whyTOTPOnlyRenew: La aplicación autorizadora no puede ser quitada mientras la clave - de seguridad siga registrada. - renewTOTPConfirm: Esto causará que los códigos de verificación de la aplicación - anterior dejen de funcionar - renewTOTPOk: Reconfigurar securityKeyNotSupported: Tu navegador no soporta claves de seguridad. step2Click: Presionar este código QR te permitirá registrar la autorización 2FA a tu clave de seguridad o aplicación autorizadora. - registerTOTPBeforeKey: Por favor configura una aplicación autorizadora para registrar - una clave de seguridad o de paso. securityKeyName: Ingresa el nombre de la clave tapSecurityKey: Por favor, espera al navegador para registrar la clave de seguridad o de paso - renewTOTPCancel: Cancelar token: Token 2FA removeKey: Quitar clave de seguridad _permissions: diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index 1d5831416c..0b1043790c 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -1312,19 +1312,10 @@ _2fa: step2Click: En cliquant sur ce QR code, vous pourrez enregistrer l'authentification à deux facteurs (2FA) sur votre clé de sécurité ou votre application d'authentification sur téléphone. - whyTOTPOnlyRenew: L'application d'authentification ne peut pas être supprimée tant - qu'une clé de sécurité est enregistrée. securityKeyName: Entrez un nom de clé removeKeyConfirm: Voulez-vous vraiment supprimer la clé {name} ? - renewTOTP: Reconfigurer l'application d'authentification - renewTOTPConfirm: Cela entraînera l'arrêt de fonctionnement des codes de vérification - provenant de votre application précédente - renewTOTPOk: Reconfigurer securityKeyNotSupported: Votre navigateur ne prend pas en charge les clés de sécurité. removeKey: Supprimer la clé de sécurité - renewTOTPCancel: Annuler - registerTOTPBeforeKey: Veuillez configurer une application d'authentification pour - enregistrer une clé de sécurité ou un mot de passe. tapSecurityKey: Veuillez suivre les instructions de votre navigateur pour enregistrer la clé de sécurité ou le mot de passe _permissions: diff --git a/locales/id-ID.yml b/locales/id-ID.yml index 925fadb404..ee902f2be3 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -1300,8 +1300,6 @@ _2fa: securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu." - renewTOTPConfirm: Ini akan menyebabkan kode verifikasi dari aplikasimu sebelumnya - berhenti bekerja token: Token 2FA chromePasskeyNotSupported: Kunci pas Chrome saat ini tidak didukung. securityKeyName: Masukkan nama kunci @@ -1310,15 +1308,9 @@ _2fa: keamanan atau apl ontentikasi ponsel. step3Title: Masukkan kode otentikasi securityKeyNotSupported: Perambanmu tidak mendukung kunci keamanan. - renewTOTPOk: Konfigurasi ulang - renewTOTPCancel: Batal - registerTOTPBeforeKey: Silakan atur apl otentikator untuk mendaftarkan kunci keamanan - atau kunci pas. tapSecurityKey: Silakan ikuti perambanmu untuk mendaftarkan kunci keamanan atau kunci pas removeKeyConfirm: Yakin menghapus kunci {name}? - whyTOTPOnlyRenew: Apl otentikator tidak dapat dihapus selama kunci keamanan didaftarkan. - renewTOTP: Konfigurasi ulang apl otentikator _permissions: "read:account": "Lihat informasi akun" "write:account": "Sunting informasi akun" diff --git a/locales/it-IT.yml b/locales/it-IT.yml index 1bb069a512..7c3f130928 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -1220,7 +1220,6 @@ _tutorial: _2fa: registerTOTP: "Aggiungi app di autenticazione" securityKeyName: Scegli un nome per la chiave - renewTOTPOk: Riconfigura step2: Poi, scansiona il QR code mostrato a schermo. securityKeyInfo: Oltre alle impronte digitali o al PIN, puoi anche autenticarti con chiavi di sicurezza hardware che supportano FIDO2 per rendere il tuo account @@ -1230,19 +1229,12 @@ _2fa: fattori (2FA). step3: Inserisci il token fornito dalla tua app per terminare. step4: Da ora in poi i futuri tentativi di login necessiteranno del token. - registerTOTPBeforeKey: Prima installa una app di autenticazione o registra una chiave - di sicurezza o una pass key. token: Token 2FA - whyTOTPOnlyRenew: La app di autenticazione non può essere rimossa finché la chiave - di sicurezza è registrata. step2Click: Cliccando sul QR code potrai registrare la 2FA nella tua chiave di sicurezza o nella app di autenticazione dello smartphone. step2Url: 'Puoi anche chiamare questo URL se sei su desktop:' securityKeyNotSupported: Il tuo browser non supporta le chiavi di sicurezza. chromePasskeyNotSupported: Le passkey di Chrome non sono supportate. - renewTOTPConfirm: I codici di verifica già impostati in precedenza smetteranno di - funzionare - renewTOTP: Riconfigura la app di autenticazione registerSecurityKey: Registra una chiave di sicurezza o pass key step1: Prima di tutto, installa una app di autenticazione (tipo {a} o {b}) sul tuo device. @@ -1250,7 +1242,6 @@ _2fa: sicurezza o la pass key removeKey: Rimuovi la chiave di sicurezza removeKeyConfirm: Confermi la rimozione della chiave {name} ? - renewTOTPCancel: Annulla _permissions: "read:account": "Visualizzare le informazioni dell'account" "write:account": "Modificare le informazioni dell'account" diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index cb1070715c..cd974bb479 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1355,7 +1355,6 @@ _2fa: step3: "アプリに表示されている確認コード(トークン)を入力して完了です。" step4: "これからログインするときも、同じように確認コードを入力します。" securityKeyNotSupported: "お使いのブラウザはセキュリティキーに対応していません。" - registerTOTPBeforeKey: "セキュリティキー・パスキーを登録するには、まず認証アプリの設定を行なってください。" securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキー、端末の生体認証やPINロック、パスキーといった、WebAuthn由来の鍵を登録します。" chromePasskeyNotSupported: "Chromeのパスキーは現在サポートしていません。" registerSecurityKey: "セキュリティキー・パスキーを登録する" @@ -1363,11 +1362,6 @@ _2fa: tapSecurityKey: "ブラウザの指示に従い、セキュリティキーやパスキーを登録してください" removeKey: "セキュリティキーを削除" removeKeyConfirm: "{name}を削除しますか?" - whyTOTPOnlyRenew: "セキュリティキーが登録されている場合、認証アプリの設定は解除できません。" - renewTOTP: "認証アプリを再設定" - renewTOTPConfirm: "今までの認証アプリの確認コードは使用できなくなります" - renewTOTPOk: "再設定する" - renewTOTPCancel: "やめておく" token: "多要素認証トークン" _permissions: "read:account": "アカウントの情報を見る" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index c27077b17f..722d48abf8 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -1242,18 +1242,12 @@ _2fa: 수 있습니다." step2Click: QR 코드를 클릭하여 사용 중인 보안 키 또는 인증 앱을 등록할 수 있습니다. step3Title: 확인 코드를 입력 - registerTOTPBeforeKey: 보안 키/패스 키를 등록하시려면 우선 인증 앱 설정을 마치십시오. securityKeyNotSupported: 이 브라우저는 보안 키를 지원하지 않습니다. chromePasskeyNotSupported: 현재 Chrome의 패스키는 지원하지 않습니다. token: 2차 인증 토큰 removeKey: 보안 키를 삭제 removeKeyConfirm: '{name}을 삭제하시겠습니까?' - renewTOTPCancel: 취소 - renewTOTPConfirm: 지금 사용 중인 인증 앱의 확인 코드는 사용할 수 없게 됩니다 securityKeyName: 키 이름 입력 - renewTOTPOk: 재설정 - whyTOTPOnlyRenew: 보안 키가 등록되어 있는 상태에서 인증 앱 설정을 해제할 수 없습니다. - renewTOTP: 인증 앱을 재설정 tapSecurityKey: 브라우저의 지시에 따라 보안 키나 패스 키를 등록하십시오 _permissions: "read:account": "계정의 정보를 봅니다" diff --git a/locales/no-NO.yml b/locales/no-NO.yml index 0fe80ad4da..c817d46c24 100644 --- a/locales/no-NO.yml +++ b/locales/no-NO.yml @@ -1677,18 +1677,12 @@ _2fa: step3: Oppgi en engangskode for å fullføre oppsettet. step1: Først, installer en app for engangskoder (slik som {a} eller {b}) på en enhet. step3Title: Skriv inn en autentiseringskode - renewTOTPCancel: Avbryt securityKeyName: Oppgi et nøkkelnavn - renewTOTPOk: Rekonfigurer registerSecurityKey: Registrer en sikkerhetsnøkkel step2: Deretter kan du scanne QR-koden som vises på skjermen. registerTOTP: Registrer engangskode-app removeKeyConfirm: Sikker på at du vil slette nøkkelen {name}? - registerTOTPBeforeKey: Sett opp en autentiserings-app for å registrere en sikkerhetsnøkkel. chromePasskeyNotSupported: Passkeys i Chrome er foreløpig ikke støttet. - renewTOTPConfirm: Dette vil føre til at kodene fra den forrige appen din vil slutte - å virke - renewTOTP: Rekonfigurer autentiserings-app securityKeyNotSupported: Nettleseren din tillater ikke sikkerhetsnøkler. step2Click: Når du klikker på QR-koden kan du registrere den som en tofaktor-pålogging på en sikkerhetsnøkkel eller engangskode-app. diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index 5e8b4b914a..9de2c135b9 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -1286,17 +1286,8 @@ _2fa: removeKey: Удалить ключ безопасности step2Click: Нажав на этот QR-код, вы сможете зарегистрировать 2FA в вашем ключе безопасности или приложении-аутентификаторе для телефона. - registerTOTPBeforeKey: Пожалуйста, настройте приложение-аутентификатор, чтобы зарегистрировать - ключ безопасности или пароль. chromePasskeyNotSupported: Пароли Chrome пока не поддерживаются. - renewTOTP: Перенастроить приложение-аутентификатор - renewTOTPConfirm: Это приведет к тому, что коды подтверждения из предыдущего приложения - перестанут работать - renewTOTPOk: Перенастроить - renewTOTPCancel: Отменить token: 2FA Токен - whyTOTPOnlyRenew: Приложение аутентификатора нельзя удалить, пока зарегистрирован - ключ безопасности. tapSecurityKey: Пожалуйста, следуйте инструкциям вашего браузера, чтобы зарегистрировать ключ безопасности или ключ-пароль step3Title: Введите код аутентификации diff --git a/locales/tr-TR.yml b/locales/tr-TR.yml index 5e71dea263..fc0c236e0a 100644 --- a/locales/tr-TR.yml +++ b/locales/tr-TR.yml @@ -1325,18 +1325,13 @@ noGraze: Firefish ile çakıştığı için lütfen "Graze for Mastodon" tarayı devre dışı bırakın. isBot: Bu hesap bir bottur _2fa: - renewTOTPOk: Yeniden Yapılandır registerTOTP: Doğrulayıcı uygulamasını kaydedin - renewTOTPCancel: İptal Et - renewTOTPConfirm: Bu, önceki uygulamanızdaki doğrulama kodlarının çalışmamasına - neden olur alreadyRegistered: Zaten bir 2 faktörlü kimlik doğrulama cihazını kaydettiniz. chromePasskeyNotSupported: Chrome geçiş anahtarları şu anda desteklenmemektedir. registerSecurityKey: Bir güvenlik veya geçiş anahtarı kaydedin securityKeyName: Bir anahtar adı girin removeKey: Güvenlik anahtarını kaldır removeKeyConfirm: '{name} anahtarı gerçekten silinsin mi?' - renewTOTP: Kimlik doğrulayıcı uygulamasını yeniden yapılandırın token: 2FA Tokeni step1: Öncelikle, cihazınıza bir kimlik doğrulama uygulaması ({a} veya {b} gibi) yükleyin. @@ -1354,10 +1349,6 @@ _2fa: aracılığıyla kimlik doğrulama ayarlayabilirsiniz. tapSecurityKey: Güvenlik veya geçiş anahtarını kaydetmek için lütfen tarayıcınızı takip edin - registerTOTPBeforeKey: Bir güvenlik veya geçiş anahtarı kaydetmek için lütfen bir - kimlik doğrulama uygulaması kurun. - whyTOTPOnlyRenew: Kimlik doğrulayıcı uygulaması, bir güvenlik anahtarı kaydedildiği - sürece kaldırılamaz. _poll: voted: Oylandı deadlineTime: Zaman diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index 701078ce6d..0905848e6a 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -1104,7 +1104,6 @@ _2fa: апаратний ключ безпеки або ключ-пароль securityKeyName: Введіть назву ключа chromePasskeyNotSupported: Паролі Chrome наразі не підтримуються. - renewTOTPOk: Переналаштувати removeKey: Видалити ключ безпеки alreadyRegistered: 2FA вже налаштовано. step2Click: Натиснувши на цей QR-код, ви зможете зареєструвати 2FA у вашому ключі @@ -1117,15 +1116,7 @@ _2fa: можете налаштувати автентифікацію за допомогою апаратних ключів безпеки, які підтримують FIDO2, щоб додатково захистити свій обліковий запис. removeKeyConfirm: Дійсно видалити ключ {name}? - whyTOTPOnlyRenew: Додаток автентифікатора не можна видалити, доки зареєстровано - ключ безпеки. - renewTOTP: Переналаштувати додаток-автентифікатор - renewTOTPCancel: Скасувати - renewTOTPConfirm: Це призведе до того, що коди підтвердження з попереднього додатку - перестануть працювати token: 2FA Токен - registerTOTPBeforeKey: Будь ласка, налаштуйте додаток-автентифікатор, щоб зареєструвати - ключ безпеки або пароль. step2Url: 'Також, ви можете ввести цю URL-адресу, якщо використовуєте десктопну програму:' step3: Введіть токен, наданий вашим додатком, щоб завершити налаштування. diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml index 23af18e722..2c7790d7c8 100644 --- a/locales/vi-VN.yml +++ b/locales/vi-VN.yml @@ -1342,24 +1342,16 @@ _2fa: securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa cho tài khoản của mình." - registerTOTPBeforeKey: Vui lòng thiết lập một ứng dụng xác thực để đăng ký khóa - bảo mật hoặc mật khẩu. tapSecurityKey: Vui lòng theo dõi trình duyệt của bạn để đăng ký mã bảo mật hoặc mã khóa - renewTOTPConfirm: Điều này sẽ khiến mã xác minh từ ứng dụng trước của bạn ngừng - hoạt động securityKeyName: Nhập tên mã khóa step3Title: Nhập mã xác thực chromePasskeyNotSupported: Mật khẩu Chrome hiện không được hỗ trợ. removeKeyConfirm: Thực sự xóa khóa {name}? - whyTOTPOnlyRenew: Không thể xóa ứng dụng xác thực miễn là đã đăng ký khóa bảo mật. - renewTOTPOk: Cấu hình lại - renewTOTPCancel: Hủy bỏ removeKey: Xóa khóa bảo mật step2Click: Nhấn vào mã QR này sẽ cho phép bạn đăng ký 2FA cho khóa bảo mật hoặc ứng dụng xác thực điện thoại của bạn. securityKeyNotSupported: Trình duyệt của bạn không hỗ trợ khóa bảo mật. - renewTOTP: Định cấu hình lại ứng dụng xác thực token: 2FA Token _permissions: "read:account": "Xem thông tin tài khoản của bạn" diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index bc43214a69..e092f5c25f 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -1258,12 +1258,7 @@ _2fa: step3: "输入您的应用提供的令牌以完成设置。" step4: "从现在开始,任何登录操作都将要求您提供这样一个登录令牌。" securityKeyInfo: "除了指纹或 PIN 身份验证外,您还可以通过支持 FIDO2 的硬件安全密钥设置身份验证,以进一步保护您的账号。" - renewTOTPOk: 重新配置 - renewTOTPCancel: 取消 token: 2FA 令牌 - renewTOTP: 重新配置身份验证器应用 - registerTOTPBeforeKey: 请先设置认证器应用以注册安全或通行密钥。 - renewTOTPConfirm: 这将导致您之前应用中的验证码失效 step3Title: 输入验证码 step2Click: 点击此二维码将允许您在安全密钥或手机身份验证器应用中注册 2FA。 securityKeyNotSupported: 您的浏览器不支持安全密钥。 @@ -1272,7 +1267,6 @@ _2fa: tapSecurityKey: 请按照您的浏览器的指示注册安全或通行密钥 removeKey: 移除安全密钥 removeKeyConfirm: 真的要删除 {name} 密钥吗? - whyTOTPOnlyRenew: 只要注册了安全密钥,就无法删除身份验证器应用。 _permissions: "read:account": "查看账号信息" "write:account": "更改账号信息" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 7c28da0573..6a02442d23 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -1254,18 +1254,12 @@ _2fa: step3: "輸入您的App提供的權杖以完成設定。" step4: "從現在開始,任何登入操作都將要求您提供權杖。" securityKeyInfo: "您可以設定使用支援FIDO2的硬體安全鎖、終端設備的指纹認證或者PIN碼來登入。" - renewTOTPCancel: 取消 removeKey: 移除安全金鑰 removeKeyConfirm: 真的要刪掉 {name} 嗎? - renewTOTP: 重新配置身份驗證器應用程式 chromePasskeyNotSupported: 目前不支持 Chrome 密鑰。 - whyTOTPOnlyRenew: 只要註冊了安全金鑰,就無法刪除身份驗證器應用程式。 - renewTOTPConfirm: 這將導致您之前的身分驗證器應用程式停止工作 securityKeyName: 取一個金鑰的名字 tapSecurityKey: 請按照您的瀏覽器註冊安全金鑰或密碼 token: 兩步驟驗證金鑰 - registerTOTPBeforeKey: 請設置身份驗證器應用程式以註冊安全金鑰或密碼。 - renewTOTPOk: 重新配置 step3Title: 輸入驗證碼 securityKeyNotSupported: 您使用的瀏覧器不支援安全金鑰(Security key)。 step2Click: 點擊此二維條碼以註冊2FA至你的安全密鑰或手機的Authenticator應用程式。 diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index c8ca9f91e9..c26c69260b 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -526,11 +526,9 @@ export const UserRepository = db.getRepository(User).extend({ ffVisibility: profile!.ffVisibility, twoFactorEnabled: profile!.twoFactorEnabled, usePasswordLessLogin: profile!.usePasswordLessLogin, - securityKeys: profile!.twoFactorEnabled - ? UserSecurityKeys.countBy({ - userId: user.id, - }).then((result) => result >= 1) - : false, + securityKeys: UserSecurityKeys.countBy({ + userId: user.id, + }).then((result) => result >= 1), } : {}), @@ -576,18 +574,16 @@ export const UserRepository = db.getRepository(User).extend({ ? { email: profile!.email, emailVerified: profile!.emailVerified, - securityKeysList: profile!.twoFactorEnabled - ? UserSecurityKeys.find({ - where: { - userId: user.id, - }, - select: { - id: true, - name: true, - lastUsed: true, - }, - }) - : [], + securityKeysList: UserSecurityKeys.find({ + where: { + userId: user.id, + }, + select: { + id: true, + name: true, + lastUsed: true, + }, + }), } : {}), diff --git a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts index b8104e318f..b4bfadfd02 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/key-done.ts @@ -47,10 +47,6 @@ export default define(meta, paramDef, async (ps, user) => { throw new Error("incorrect password"); } - if (!profile.twoFactorEnabled) { - throw new Error("2fa not enabled"); - } - const clientData = JSON.parse(ps.clientDataJSON); if (clientData.type !== "webauthn.create") { @@ -148,6 +144,8 @@ export default define(meta, paramDef, async (ps, user) => { }), ); + UserProfiles.update(user.id, { securityKeysAvailable: true }); + return { id: credentialIdString, name: ps.name, diff --git a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts index 8080c9390f..78b68216ad 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/register-key.ts @@ -32,10 +32,6 @@ export default define(meta, paramDef, async (ps, user) => { throw new Error("incorrect password"); } - // if (!profile.twoFactorEnabled) { - // throw new Error("2fa not enabled"); - // } - // 32 byte challenge const entropy = await randomBytes(32); const challenge = entropy diff --git a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts index b3bc5bdfac..0cdf8780ef 100644 --- a/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts +++ b/packages/backend/src/server/api/endpoints/i/2fa/remove-key.ts @@ -47,8 +47,9 @@ export default define(meta, paramDef, async (ps, user) => { }); if (keyCount === 0) { - await UserProfiles.update(me.id, { + await UserProfiles.update(user.id, { usePasswordLessLogin: false, + securityKeysAvailable: false, }); } diff --git a/packages/backend/src/server/api/private/signin.ts b/packages/backend/src/server/api/private/signin.ts index 3e70d80fe2..fb3596d9b1 100644 --- a/packages/backend/src/server/api/private/signin.ts +++ b/packages/backend/src/server/api/private/signin.ts @@ -116,7 +116,7 @@ export default async (ctx: Koa.Context) => { ); } - if (!profile.twoFactorEnabled) { + if (!profile.twoFactorEnabled && !profile.securityKeysAvailable) { if (same) { signin(ctx, user); return; @@ -128,7 +128,7 @@ export default async (ctx: Koa.Context) => { } } - if (token) { + if (token && profile.twoFactorEnabled) { if (!same) { await fail(403, { id: "932c904e-9460-45b7-9ce6-7ed33be7eb2c", diff --git a/packages/client/src/components/MkSignin.vue b/packages/client/src/components/MkSignin.vue index 10bcfc3bdf..7fb2e6f16a 100644 --- a/packages/client/src/components/MkSignin.vue +++ b/packages/client/src/components/MkSignin.vue @@ -79,10 +79,16 @@ {{ i18n.ts.retry }} -
+

{{ i18n.ts.or }}

-
+

{{ i18n.ts.twoStepAuthentication }}

@@ -247,25 +253,23 @@ function queryKey() { function onSubmit() { signing.value = true; console.log("submit"); - if (!totpLogin.value && user.value && user.value.twoFactorEnabled) { - if (window.PublicKeyCredential && user.value.securityKeys) { - os.api("signin", { - username: username.value, - password: password.value, - "hcaptcha-response": hCaptchaResponse.value, - "g-recaptcha-response": reCaptchaResponse.value, + if (window.PublicKeyCredential && user.value.securityKeys) { + os.api("signin", { + username: username.value, + password: password.value, + "hcaptcha-response": hCaptchaResponse.value, + "g-recaptcha-response": reCaptchaResponse.value, + }) + .then((res) => { + totpLogin.value = true; + signing.value = false; + challengeData.value = res; + return queryKey(); }) - .then((res) => { - totpLogin.value = true; - signing.value = false; - challengeData.value = res; - return queryKey(); - }) - .catch(loginFailed); - } else { - totpLogin.value = true; - signing.value = false; - } + .catch(loginFailed); + } else if (!totpLogin.value && user.value && user.value.twoFactorEnabled) { + totpLogin.value = true; + signing.value = false; } else { os.api("signin", { username: username.value, diff --git a/packages/client/src/pages/settings/2fa.vue b/packages/client/src/pages/settings/2fa.vue index 75c2e32f82..8b354e05ef 100644 --- a/packages/client/src/pages/settings/2fa.vue +++ b/packages/client/src/pages/settings/2fa.vue @@ -14,17 +14,7 @@
- - - - {{ i18n.ts._2fa.registerTOTPBeforeKey }} - -