diff --git a/docs/docs/configuration/options.md b/docs/docs/configuration/options.md index 8644ef6f5b..c3a038327d 100644 --- a/docs/docs/configuration/options.md +++ b/docs/docs/configuration/options.md @@ -114,6 +114,12 @@ session: { // Use it to limit write operations. Set to 0 to always update the database. // Note: This option is ignored if using JSON Web Tokens updateAge: 24 * 60 * 60, // 24 hours + + // The session token is usually either a random UUID or string, however if you + // need a more customized session token string, you can define your own generate function. + generateSessionToken: () => { + return randomUUID?.() ?? randomBytes(32).toString("hex") + } } ``` diff --git a/packages/next-auth/src/core/init.ts b/packages/next-auth/src/core/init.ts index 478519cb17..ac5f3373b0 100644 --- a/packages/next-auth/src/core/init.ts +++ b/packages/next-auth/src/core/init.ts @@ -1,3 +1,4 @@ +import { randomBytes, randomUUID } from "crypto" import { NextAuthOptions } from ".." import logger from "../utils/logger" import parseUrl from "../utils/parse-url" @@ -86,6 +87,10 @@ export async function init({ strategy: userOptions.adapter ? "database" : "jwt", maxAge, updateAge: 24 * 60 * 60, + generateSessionToken: () => { + // Use `randomUUID` if available. (Node 15.6+) + return randomUUID?.() ?? randomBytes(32).toString("hex") + }, ...userOptions.session, }, // JWT options diff --git a/packages/next-auth/src/core/lib/callback-handler.ts b/packages/next-auth/src/core/lib/callback-handler.ts index 1513bf1eb7..3701d2b6ad 100644 --- a/packages/next-auth/src/core/lib/callback-handler.ts +++ b/packages/next-auth/src/core/lib/callback-handler.ts @@ -1,4 +1,3 @@ -import { randomBytes, randomUUID } from "crypto" import { AccountNotLinkedError } from "../errors" import { fromDate } from "./utils" @@ -37,7 +36,7 @@ export default async function callbackHandler(params: { adapter, jwt, events, - session: { strategy: sessionStrategy }, + session: { strategy: sessionStrategy, generateSessionToken }, } = options // If no adapter is configured then we don't have a database and cannot @@ -219,8 +218,3 @@ export default async function callbackHandler(params: { } } } - -function generateSessionToken() { - // Use `randomUUID` if available. (Node 15.6++) - return randomUUID?.() ?? randomBytes(32).toString("hex") -} diff --git a/packages/next-auth/src/core/types.ts b/packages/next-auth/src/core/types.ts index 6c998d335d..bfc57f452d 100644 --- a/packages/next-auth/src/core/types.ts +++ b/packages/next-auth/src/core/types.ts @@ -468,6 +468,13 @@ export interface SessionOptions { * @default 86400 // 1 day */ updateAge: number + /** + * Generate a custom session token for database-based sessions. + * By default, a random UUID or string is generated depending on the Node.js version. + * However, you can specify your own custom string (such as CUID) to be used. + * @default `randomUUID` or `randomBytes.toHex` depending on the Node.js version + */ + generateSessionToken: () => string } export interface DefaultUser {