diff --git a/docs/content/docs/plugins/one-time-token.mdx b/docs/content/docs/plugins/one-time-token.mdx index 912df9f9ce..ed9f391db9 100644 --- a/docs/content/docs/plugins/one-time-token.mdx +++ b/docs/content/docs/plugins/one-time-token.mdx @@ -82,3 +82,4 @@ oneTimeToken({ expiresIn: 10 // 10 minutes }) ``` +* **`generateToken`**: A custom token generator function that takes `session` object and a `ctx` as paramters. \ No newline at end of file diff --git a/packages/better-auth/src/plugins/one-time-token/index.ts b/packages/better-auth/src/plugins/one-time-token/index.ts index f6185864e5..0bda87a650 100644 --- a/packages/better-auth/src/plugins/one-time-token/index.ts +++ b/packages/better-auth/src/plugins/one-time-token/index.ts @@ -2,6 +2,7 @@ import { z } from "zod"; import { createAuthEndpoint, type BetterAuthPlugin } from ".."; import { sessionMiddleware } from "../../api"; import { generateRandomString } from "../../crypto"; +import type { GenericEndpointContext, Session, User } from "../../types"; interface OneTimeTokenOptions { /** @@ -14,6 +15,16 @@ interface OneTimeTokenOptions { * Only allow server initiated requests */ disableClientRequest?: boolean; + /** + * Generate a custom token + */ + generateToken?: ( + session: { + user: User & Record; + session: Session & Record; + }, + ctx: GenericEndpointContext, + ) => Promise; } export const oneTimeToken = (options?: OneTimeTokenOptions) => { @@ -34,7 +45,9 @@ export const oneTimeToken = (options?: OneTimeTokenOptions) => { }); } const session = c.context.session; - const token = generateRandomString(32); + const token = options?.generateToken + ? await options.generateToken(session, c) + : generateRandomString(32); const expiresAt = new Date( Date.now() + (options?.expiresIn ?? 3) * 60 * 1000, );