From e5f3f3131173516fa875b9f66fb5e668e577e718 Mon Sep 17 00:00:00 2001 From: Marti Date: Fri, 1 Aug 2025 19:43:35 +0300 Subject: [PATCH] feat(passkey): allow custom passkey name during registration (#3587) * feat(passkey): allow custom passkey name during registration * lint * docs: specify name prop in passkey docs * chore: add changeset * chore: changeset * chore: update changeset * remove changest --------- Co-authored-by: Bereket Engida <86073083+Bekacru@users.noreply.github.com> --- .changeset/curly-kids-film.md | 5 +++++ docs/content/docs/plugins/passkey.mdx | 4 ++++ packages/better-auth/src/plugins/passkey/client.ts | 3 +++ packages/better-auth/src/plugins/passkey/index.ts | 8 +++++++- 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 .changeset/curly-kids-film.md diff --git a/.changeset/curly-kids-film.md b/.changeset/curly-kids-film.md new file mode 100644 index 0000000000..19027fdfa5 --- /dev/null +++ b/.changeset/curly-kids-film.md @@ -0,0 +1,5 @@ +--- +"better-auth": patch +--- + +feat(passkey): allow custom passkey name during registration diff --git a/docs/content/docs/plugins/passkey.mdx b/docs/content/docs/plugins/passkey.mdx index 79987d2b79..6475112459 100644 --- a/docs/content/docs/plugins/passkey.mdx +++ b/docs/content/docs/plugins/passkey.mdx @@ -95,6 +95,10 @@ To add or register a passkey make sure a user is authenticated and then call the ```ts type addPasskey = { + /** + * An optional name to label the authenticator account being registered. If not provided, it will default to the user's email address or user ID + */ + name?: string = "example-passkey-name" /** * You can also specify the type of authenticator you want to register. Default behavior allows both platform and cross-platform passkeys */ diff --git a/packages/better-auth/src/plugins/passkey/client.ts b/packages/better-auth/src/plugins/passkey/client.ts index 39c0651af4..acefa6c785 100644 --- a/packages/better-auth/src/plugins/passkey/client.ts +++ b/packages/better-auth/src/plugins/passkey/client.ts @@ -106,6 +106,9 @@ export const getPasskeyActions = ( ...(opts?.authenticatorAttachment && { authenticatorAttachment: opts.authenticatorAttachment, }), + ...(opts?.name && { + name: opts.name, + }), }, }, ); diff --git a/packages/better-auth/src/plugins/passkey/index.ts b/packages/better-auth/src/plugins/passkey/index.ts index 64b7700eb6..5c5e153553 100644 --- a/packages/better-auth/src/plugins/passkey/index.ts +++ b/packages/better-auth/src/plugins/passkey/index.ts @@ -133,6 +133,7 @@ export const passkey = (options?: PasskeyOptions) => { authenticatorAttachment: z .enum(["platform", "cross-platform"]) .optional(), + name: z.string().optional(), }) .optional(), metadata: { @@ -150,6 +151,11 @@ export const passkey = (options?: PasskeyOptions) => { "cross-platform" for authenticators that can be used across devices.`, required: false, }, + name: { + description: `Optional custom name for the passkey. + This can help identify the passkey when managing multiple credentials.`, + required: false, + }, }, }, content: { @@ -271,7 +277,7 @@ export const passkey = (options?: PasskeyOptions) => { rpName: opts.rpName || ctx.context.appName, rpID: getRpID(opts, ctx.context.options.baseURL), userID, - userName: session.user.email || session.user.id, + userName: ctx.query?.name || session.user.email || session.user.id, userDisplayName: session.user.email || session.user.id, attestationType: "none", excludeCredentials: userPasskeys.map((passkey) => ({