diff --git a/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java b/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java index 669c621..3d27d08 100644 --- a/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java +++ b/src/main/java/net/siegeln/cameleer/saas/account/AccountService.java @@ -114,10 +114,20 @@ public class AccountService { // The secret is only registered after the user verifies the 6-digit code. var user = logtoClient.getUser(userId); String email = user != null ? String.valueOf(user.getOrDefault("primaryEmail", "")) : ""; - String label = email.isBlank() ? userId : email; + String account = email.isBlank() ? userId : email; + + // Include org name in issuer so authenticator apps show "Cameleer - OrgName" + String issuer = "Cameleer"; + var orgs = logtoClient.getUserOrganizations(userId); + if (!orgs.isEmpty()) { + issuer = "Cameleer - " + orgs.getFirst().get("name"); + } + + String encodedIssuer = java.net.URLEncoder.encode(issuer, java.nio.charset.StandardCharsets.UTF_8); + String encodedAccount = java.net.URLEncoder.encode(account, java.nio.charset.StandardCharsets.UTF_8); String otpauthUri = String.format( - "otpauth://totp/Cameleer:%s?secret=%s&issuer=Cameleer&algorithm=SHA1&digits=6&period=30", - label, secret); + "otpauth://totp/%s:%s?secret=%s&issuer=%s&algorithm=SHA1&digits=6&period=30", + encodedIssuer, encodedAccount, secret, encodedIssuer); return new MfaSetupData(secret, otpauthUri); } diff --git a/ui/src/components/account/PasskeySection.tsx b/ui/src/components/account/PasskeySection.tsx index 26c9334..8aaa448 100644 --- a/ui/src/components/account/PasskeySection.tsx +++ b/ui/src/components/account/PasskeySection.tsx @@ -107,9 +107,9 @@ export function PasskeySection({ bare }: { bare?: boolean }) { ) : ( <> -