···11+pub mod config;
22+pub mod endpoints;
33+pub mod providers;
44+55+pub use config::SsoConfig;
66+pub use providers::{AuthUrlResult, SsoError, SsoManager, SsoProvider, SsoUserInfo};
···170170 "signIn": "Sign in",
171171 "passkeyAccount": "Passkey",
172172 "passwordAccount": "Password",
173173+ "ssoAccount": "SSO",
174174+ "ssoSubtitle": "Create an account using an external provider",
175175+ "noSsoProviders": "No SSO providers are configured on this server.",
176176+ "ssoHint": "Choose a provider to create your account:",
177177+ "continueWith": "Continue with {provider}",
173178 "validation": {
174179 "handleRequired": "Handle is required",
175180 "handleNoDots": "Handle cannot contain dots. You can set up a custom domain handle after creating your account.",
···275280 "verificationCode": "Verification Code",
276281 "verificationCodePlaceholder": "Enter verification code",
277282 "confirmEmailChange": "Confirm Email Change",
283283+ "emailTokenHint": "Enter the code from the email, or click the link in the email on any device.",
284284+ "emailUpdateAuthorized": "Email change authorized! Click confirm to complete.",
278285 "updating": "Updating...",
279286 "changeHandle": "Change Handle",
280287 "currentHandle": "Current: @{handle}",
···677684 "checkingPasskey": "Checking passkey...",
678685 "signInWithPasskey": "Sign in with passkey",
679686 "passkeyNotSetUp": "Passkey not set up",
680680- "orUsePassword": "or use password",
687687+ "orUsePassword": "Or use password",
681688 "password": "Password",
682689 "rememberDevice": "Remember this device",
683690 "passkeyHintChecking": "Checking passkey status...",
···685692 "passkeyHintNotAvailable": "No passkeys registered for this account",
686693 "passkeyHint": "Use your device's biometrics or security key",
687694 "passwordPlaceholder": "Enter your password",
688688- "usePasskey": "Use Passkey"
695695+ "usePasskey": "Use Passkey",
696696+ "orContinueWith": "Or continue with",
697697+ "orUseCredentials": "Or sign in with credentials"
698698+ },
699699+ "sso": {
700700+ "linkedAccounts": "Linked Accounts",
701701+ "linkedAccountsDesc": "External accounts linked to your identity for single sign-on.",
702702+ "noLinkedAccounts": "No linked accounts",
703703+ "noLinkedAccountsDesc": "Link an external account to enable quick sign-in with that provider.",
704704+ "linkAccount": "Link Account",
705705+ "unlinkAccount": "Unlink",
706706+ "unlinkConfirm": "Are you sure you want to unlink this account?",
707707+ "unlinked": "Unlinked {provider}",
708708+ "lastLoginAt": "Last used",
709709+ "linkedAt": "Linked"
689710 },
690711 "consent": {
691712 "title": "Authorize Application",
···798819 "backToApp": "Back to Application"
799820 }
800821 },
822822+ "sso_register": {
823823+ "title": "Complete Registration",
824824+ "subtitle": "Creating account with {provider}",
825825+ "handle_label": "Choose your handle",
826826+ "handle_available": "Available",
827827+ "handle_taken": "Already taken",
828828+ "submit": "Create Account",
829829+ "error_expired": "Registration session expired. Please try again.",
830830+ "error_handle_required": "Please choose a handle",
831831+ "emailVerifiedByProvider": "This email is verified by {provider}. No additional verification needed.",
832832+ "emailChangedNeedsVerification": "If you use a different email, you will need to verify it.",
833833+ "infoAfterTitle": "After creating your account",
834834+ "infoAddPassword": "Add a password for traditional login",
835835+ "infoAddPasskey": "Set up a passkey for passwordless sign-in",
836836+ "infoLinkProviders": "Link additional SSO providers",
837837+ "infoChangeHandle": "Change your handle or use a custom domain",
838838+ "tryAgain": "Try again"
839839+ },
801840 "verify": {
802841 "title": "Verify Your Account",
803842 "subtitle": "We've sent a verification code to your {channel}. Enter it below to complete registration.",
···834873 "updateEmail": "Update Email",
835874 "updating": "Updating...",
836875 "emailUpdated": "Your email has been updated successfully.",
837837- "emailUpdatedInfo": "You may need to verify your new email address."
876876+ "emailUpdatedInfo": "You may need to verify your new email address.",
877877+ "emailAuthorizeSuccess": "Your email update has been authorized.",
878878+ "emailAuthorizeInfo": "You can now complete the change on your original device."
838879 },
839880 "resetPassword": {
840881 "title": "Reset Password",
+36-1
frontend/src/locales/fi.json
···170170 "signIn": "Kirjaudu sisään",
171171 "passkeyAccount": "Pääsyavain",
172172 "passwordAccount": "Salasana",
173173+ "ssoAccount": "SSO",
174174+ "ssoSubtitle": "Luo tili ulkoisen palveluntarjoajan kautta",
175175+ "noSsoProviders": "Tälle palvelimelle ei ole määritetty SSO-palveluntarjoajia.",
176176+ "ssoHint": "Valitse palveluntarjoaja tilin luomiseksi:",
177177+ "continueWith": "Jatka palvelulla {provider}",
173178 "validation": {
174179 "handleRequired": "Käyttäjänimi vaaditaan",
175180 "handleNoDots": "Käyttäjänimi ei voi sisältää pisteitä. Voit määrittää oman verkkotunnuksen tilin luomisen jälkeen.",
···275280 "verificationCode": "Vahvistuskoodi",
276281 "verificationCodePlaceholder": "Syötä vahvistuskoodi",
277282 "confirmEmailChange": "Vahvista sähköpostin vaihto",
283283+ "emailTokenHint": "Syötä sähköpostissa oleva koodi tai napsauta linkkiä sähköpostissa millä tahansa laitteella.",
284284+ "emailUpdateAuthorized": "Sähköpostin vaihto hyväksytty! Napsauta vahvista viimeistelläksesi.",
278285 "updating": "Päivitetään...",
279286 "changeHandle": "Vaihda käyttäjänimi",
280287 "currentHandle": "Nykyinen: @{handle}",
···685692 "passkeyHintNotAvailable": "Ei rekisteröityjä pääsyavaimia tälle tilille",
686693 "passkeyHint": "Käytä laitteesi biometriikkaa tai suojausavainta",
687694 "passwordPlaceholder": "Syötä salasanasi",
688688- "usePasskey": "Käytä pääsyavainta"
695695+ "usePasskey": "Käytä pääsyavainta",
696696+ "orContinueWith": "Tai jatka käyttäen",
697697+ "orUseCredentials": "Tai kirjaudu tunnuksilla"
698698+ },
699699+ "sso": {
700700+ "linkedAccounts": "Linkitetyt tilit",
701701+ "linkedAccountsDesc": "Ulkoiset tilit, jotka on linkitetty identiteettiisi kertakirjautumista varten.",
702702+ "noLinkedAccounts": "Ei linkitettyjä tilejä",
703703+ "noLinkedAccountsDesc": "Linkitä ulkoinen tili ottaaksesi käyttöön nopean kirjautumisen kyseisellä palveluntarjoajalla.",
704704+ "linkAccount": "Linkitä tili",
705705+ "unlinkAccount": "Poista linkitys",
706706+ "unlinkConfirm": "Haluatko varmasti poistaa tämän tilin linkityksen?",
707707+ "unlinked": "Linkitys poistettu: {provider}",
708708+ "lastLoginAt": "Viimeksi käytetty",
709709+ "linkedAt": "Linkitetty"
689710 },
690711 "consent": {
691712 "title": "Valtuuta sovellus",
···798819 "backToApp": "Takaisin sovellukseen"
799820 }
800821 },
822822+ "sso_register": {
823823+ "title": "Viimeistele rekisteröinti",
824824+ "subtitle": "Luo tili käyttäen {provider}",
825825+ "handle_label": "Valitse käsittelynimi",
826826+ "handle_available": "Saatavilla",
827827+ "handle_taken": "Jo käytössä",
828828+ "submit": "Luo tili",
829829+ "error_expired": "Rekisteröintisessio on vanhentunut. Yritä uudelleen.",
830830+ "error_handle_required": "Valitse käsittelynimi",
831831+ "emailVerifiedByProvider": "Tämä sähköposti on vahvistettu {provider} kautta. Lisävahvistusta ei tarvita.",
832832+ "emailChangedNeedsVerification": "Jos käytät eri sähköpostia, sinun täytyy vahvistaa se."
833833+ },
801834 "verify": {
802835 "title": "Vahvista tilisi",
803836 "subtitle": "Olemme lähettäneet vahvistuskoodin {channel}. Syötä se alla viimeistelläksesi rekisteröinnin.",
···831864 "emailUpdateTitle": "Päivitä sähköpostiosoite",
832865 "emailUpdated": "Sähköpostiosoitteesi on päivitetty.",
833866 "emailUpdatedInfo": "Sinun on ehkä vahvistettava uusi sähköpostiosoitteesi.",
867867+ "emailAuthorizeSuccess": "Sähköpostipäivityksesi on valtuutettu.",
868868+ "emailAuthorizeInfo": "Voit nyt viimeistellä muutoksen alkuperäisellä laitteellasi.",
834869 "newEmailLabel": "Uusi sähköpostiosoite",
835870 "newEmailPlaceholder": "uusi@esimerkki.fi",
836871 "updateEmail": "Päivitä sähköposti",
···163163 "signIn": "로그인",
164164 "passkeyAccount": "패스키",
165165 "passwordAccount": "비밀번호",
166166+ "ssoAccount": "SSO",
167167+ "ssoSubtitle": "외부 제공자를 사용하여 계정 만들기",
168168+ "noSsoProviders": "이 서버에 SSO 제공자가 설정되어 있지 않습니다.",
169169+ "ssoHint": "계정을 만들 제공자를 선택하세요:",
170170+ "continueWith": "{provider}로 계속",
166171 "validation": {
167172 "handleRequired": "핸들은 필수입니다",
168173 "handleNoDots": "핸들에 점을 포함할 수 없습니다. 계정 생성 후 사용자 정의 도메인을 설정할 수 있습니다.",
···268273 "verificationCode": "인증 코드",
269274 "verificationCodePlaceholder": "인증 코드 입력",
270275 "confirmEmailChange": "이메일 변경 확인",
276276+ "emailTokenHint": "이메일의 코드를 입력하거나 다른 기기에서 이메일의 링크를 클릭하세요.",
277277+ "emailUpdateAuthorized": "이메일 변경이 승인되었습니다! 확인을 클릭하여 완료하세요.",
271278 "updating": "업데이트 중...",
272279 "changeHandle": "핸들 변경",
273280 "currentHandle": "현재: @{handle}",
···678685 "passkeyHintNotAvailable": "이 계정에 등록된 패스키가 없습니다",
679686 "passkeyHint": "기기의 생체 인식 또는 보안 키 사용",
680687 "passwordPlaceholder": "비밀번호 입력",
681681- "usePasskey": "패스키 사용"
688688+ "usePasskey": "패스키 사용",
689689+ "orContinueWith": "또는 다음으로 계속",
690690+ "orUseCredentials": "또는 자격 증명으로 로그인"
691691+ },
692692+ "sso": {
693693+ "linkedAccounts": "연결된 계정",
694694+ "linkedAccountsDesc": "싱글 사인온을 위해 연결된 외부 계정입니다.",
695695+ "noLinkedAccounts": "연결된 계정 없음",
696696+ "noLinkedAccountsDesc": "외부 계정을 연결하여 해당 제공자로 빠르게 로그인하세요.",
697697+ "linkAccount": "계정 연결",
698698+ "unlinkAccount": "연결 해제",
699699+ "unlinkConfirm": "이 계정의 연결을 해제하시겠습니까?",
700700+ "unlinked": "{provider} 연결 해제됨",
701701+ "lastLoginAt": "마지막 사용",
702702+ "linkedAt": "연결됨"
682703 },
683704 "consent": {
684705 "title": "앱 승인",
···791812 "backToApp": "앱으로 돌아가기"
792813 }
793814 },
815815+ "sso_register": {
816816+ "title": "등록 완료",
817817+ "subtitle": "{provider}로 계정 생성",
818818+ "handle_label": "핸들 선택",
819819+ "handle_available": "사용 가능",
820820+ "handle_taken": "이미 사용 중",
821821+ "submit": "계정 생성",
822822+ "error_expired": "등록 세션이 만료되었습니다. 다시 시도해 주세요.",
823823+ "error_handle_required": "핸들을 선택해 주세요",
824824+ "emailVerifiedByProvider": "이 이메일은 {provider}에서 인증되었습니다. 추가 인증이 필요하지 않습니다.",
825825+ "emailChangedNeedsVerification": "다른 이메일을 사용하시면 인증이 필요합니다."
826826+ },
794827 "verify": {
795828 "title": "계정 인증",
796829 "subtitle": "{channel}(으)로 인증 코드를 보냈습니다. 아래에 입력하여 등록을 완료하세요.",
···824857 "emailUpdateTitle": "이메일 주소 업데이트",
825858 "emailUpdated": "이메일 주소가 성공적으로 업데이트되었습니다.",
826859 "emailUpdatedInfo": "새 이메일 주소를 인증해야 할 수 있습니다.",
860860+ "emailAuthorizeSuccess": "이메일 업데이트가 승인되었습니다.",
861861+ "emailAuthorizeInfo": "이제 원래 기기에서 변경을 완료할 수 있습니다.",
827862 "newEmailLabel": "새 이메일 주소",
828863 "newEmailPlaceholder": "new@example.com",
829864 "updateEmail": "이메일 업데이트",
+36-1
frontend/src/locales/sv.json
···163163 "signIn": "Logga in",
164164 "passkeyAccount": "Nyckel",
165165 "passwordAccount": "Lösenord",
166166+ "ssoAccount": "SSO",
167167+ "ssoSubtitle": "Skapa ett konto med en extern leverantör",
168168+ "noSsoProviders": "Inga SSO-leverantörer är konfigurerade på denna server.",
169169+ "ssoHint": "Välj en leverantör för att skapa ditt konto:",
170170+ "continueWith": "Fortsätt med {provider}",
166171 "validation": {
167172 "handleRequired": "Användarnamn krävs",
168173 "handleNoDots": "Användarnamn kan inte innehålla punkter. Du kan konfigurera ett eget domännamn efter att kontot skapats.",
···268273 "verificationCode": "Verifieringskod",
269274 "verificationCodePlaceholder": "Ange verifieringskod",
270275 "confirmEmailChange": "Bekräfta e-poständring",
276276+ "emailTokenHint": "Ange koden från e-postmeddelandet, eller klicka på länken i e-postmeddelandet på valfri enhet.",
277277+ "emailUpdateAuthorized": "E-poständring godkänd! Klicka på bekräfta för att slutföra.",
271278 "updating": "Uppdaterar...",
272279 "changeHandle": "Ändra användarnamn",
273280 "currentHandle": "Nuvarande: @{handle}",
···678685 "passkeyHintNotAvailable": "Inga nycklar registrerade för detta konto",
679686 "passkeyHint": "Använd enhetens biometri eller säkerhetsnyckel",
680687 "passwordPlaceholder": "Ange ditt lösenord",
681681- "usePasskey": "Använd nyckel"
688688+ "usePasskey": "Använd nyckel",
689689+ "orContinueWith": "Eller fortsätt med",
690690+ "orUseCredentials": "Eller logga in med uppgifter"
691691+ },
692692+ "sso": {
693693+ "linkedAccounts": "Länkade konton",
694694+ "linkedAccountsDesc": "Externa konton länkade till din identitet för enkel inloggning.",
695695+ "noLinkedAccounts": "Inga länkade konton",
696696+ "noLinkedAccountsDesc": "Länka ett externt konto för att aktivera snabb inloggning med den leverantören.",
697697+ "linkAccount": "Länka konto",
698698+ "unlinkAccount": "Ta bort länk",
699699+ "unlinkConfirm": "Är du säker på att du vill ta bort länken till detta konto?",
700700+ "unlinked": "Länk till {provider} borttagen",
701701+ "lastLoginAt": "Senast använd",
702702+ "linkedAt": "Länkad"
682703 },
683704 "consent": {
684705 "title": "Auktorisera applikation",
···791812 "backToApp": "Tillbaka till applikationen"
792813 }
793814 },
815815+ "sso_register": {
816816+ "title": "Slutför registrering",
817817+ "subtitle": "Skapar konto med {provider}",
818818+ "handle_label": "Välj ditt användarnamn",
819819+ "handle_available": "Tillgängligt",
820820+ "handle_taken": "Redan taget",
821821+ "submit": "Skapa konto",
822822+ "error_expired": "Registreringssessionen har löpt ut. Försök igen.",
823823+ "error_handle_required": "Välj ett användarnamn",
824824+ "emailVerifiedByProvider": "Denna e-post är verifierad av {provider}. Ingen ytterligare verifiering behövs.",
825825+ "emailChangedNeedsVerification": "Om du använder en annan e-post måste du verifiera den."
826826+ },
794827 "verify": {
795828 "title": "Verifiera ditt konto",
796829 "subtitle": "Vi har skickat en verifieringskod till din {channel}. Ange den nedan för att slutföra registreringen.",
···824857 "emailUpdateTitle": "Uppdatera e-postadress",
825858 "emailUpdated": "Din e-postadress har uppdaterats.",
826859 "emailUpdatedInfo": "Du kan behöva verifiera din nya e-postadress.",
860860+ "emailAuthorizeSuccess": "Din e-postuppdatering har auktoriserats.",
861861+ "emailAuthorizeInfo": "Du kan nu slutföra ändringen på din ursprungliga enhet.",
827862 "newEmailLabel": "Ny e-postadress",
828863 "newEmailPlaceholder": "ny@exempel.se",
829864 "updateEmail": "Uppdatera e-post",