Skip to main content

UserSession

The UserSession interface provides type-safe access to the current user and session information from Better Auth.

Interface Definition​

import {
BetterAuthOptions,
InferSession,
InferUser,
PrettifyDeep,
} from 'better-auth';

export interface UserSession<TOptions extends BetterAuthOptions> {
session: PrettifyDeep<InferSession<TOptions>>;
user: PrettifyDeep<InferUser<TOptions>>;
}

Description​

UserSession<TOptions> is a generic interface that combines user and session information from Better Auth into a single object. It leverages Better Auth's type inference system to provide accurate typing based on your specific configuration, including any plugins or custom fields you've defined.

Type Parameters​

  • TOptions - Extends BetterAuthOptions from the Better Auth library. This parameter ensures that the user and session types match your Better Auth configuration exactly.

Properties​

session​

  • Type: PrettifyDeep<InferSession<TOptions>>
  • Description: Contains the current session information, including session ID, user ID, expiration, and any additional session fields defined by your configuration or plugins.

user​

  • Type: PrettifyDeep<InferUser<TOptions>>
  • Description: Contains the current user information, including user ID, email, name, and any additional user fields defined by your configuration or plugins.

Usage​

With Parameter Decorators​

The most common way to access UserSession is through parameter decorators in your controllers:

@Controller('/api')
class UserController {
@ApplyMiddleware(betterAuthMiddlewareServiceIdentifier)
@Get('/profile')
public async getProfile(
@HonoUserSession() session: UserSession<BetterAuthOptions>,
): Promise<UserSession<BetterAuthOptions>> {
return session;
}
}

Accessing User Information​

@Controller('/api')
class UserController {
@ApplyMiddleware(betterAuthMiddlewareServiceIdentifier)
@Get('/user-info')
public async getUserInfo(
@HonoUserSession() session: UserSession<BetterAuthOptions>,
): Promise<{ id: string; email: string; name: string }> {
return {
email: session.user.email,
id: session.user.id,
name: session.user.name,
};
}
}

Accessing Session Information​

@Controller('/api')
class SessionController {
@ApplyMiddleware(betterAuthMiddlewareServiceIdentifier)
@Get('/session-info')
public async getSessionInfo(
@HonoUserSession() session: UserSession<BetterAuthOptions>,
): Promise<{ sessionId: string; userId: string; expiresAt: Date }> {
return {
expiresAt: session.session.expiresAt,
sessionId: session.session.id,
userId: session.session.userId,
};
}
}

Handling Unauthenticated Requests​

When no valid session is found, the UserSession will be null:

@Controller('/api')
class OptionalAuthController {
@ApplyMiddleware(betterAuthMiddlewareServiceIdentifier)
@Get('/optional-auth')
public async optionalAuth(
@HonoUserSession() session: UserSession<BetterAuthOptions> | null,
): Promise<{ authenticated: boolean; userId?: string }> {
if (session === null) {
return { authenticated: false };
}

return {
authenticated: true,
userId: session.user.id,
};
}
}

Type Safety Benefits​

  • Configuration-Aware: Types reflect your exact Better Auth configuration
  • Plugin Integration: Includes types for any Better Auth plugins you've enabled
  • Custom Fields: Supports custom user and session fields
  • Null Safety: Properly handles unauthenticated states

Framework Support​

UserSession is available across all supported frameworks through their respective parameter decorators:

  • Express: Use @ExpressUserSession()
  • Express v4: Use @ExpressUserSession() (same decorator as Express)
  • Fastify: Use @FastifyUserSession()
  • Hono: Use @HonoUserSession()