Skip to content

Commit 0a35aeb

Browse files
committed
feat: enhance authentication schemas with session management and configuration options
1 parent 5c15e68 commit 0a35aeb

2 files changed

Lines changed: 68 additions & 11 deletions

File tree

packages/spec/src/api/auth.zod.ts

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,48 @@ export const AuthProvider = z.enum([
2323

2424
export const SessionUserSchema = z.object({
2525
id: z.string().describe('User ID'),
26-
username: z.string().describe('Username'),
2726
email: z.string().email().describe('Email address'),
27+
emailVerified: z.boolean().default(false).describe('Is email verified?'),
2828
name: z.string().describe('Display name'),
29-
roles: z.array(z.string()).describe('Assigned role IDs'),
30-
tenantId: z.string().describe('Current tenant ID'),
31-
avatar: z.string().optional().describe('Avatar URL'),
29+
image: z.string().optional().describe('Avatar URL'),
30+
username: z.string().optional().describe('Username (optional)'),
31+
roles: z.array(z.string()).optional().default([]).describe('Assigned role IDs'),
32+
tenantId: z.string().optional().describe('Current tenant ID'),
3233
language: z.string().default('en').describe('Preferred language'),
3334
timezone: z.string().optional().describe('Preferred timezone'),
35+
createdAt: z.date().optional(),
36+
updatedAt: z.date().optional(),
37+
});
38+
39+
export const SessionSchema = z.object({
40+
id: z.string(),
41+
expiresAt: z.date(),
42+
token: z.string().optional(),
43+
ipAddress: z.string().optional(),
44+
userAgent: z.string().optional(),
45+
userId: z.string(),
3446
});
3547

3648
// ==========================================
3749
// Requests
3850
// ==========================================
3951

52+
export const LoginType = z.enum(['email', 'username', 'phone', 'magic-link', 'social']);
53+
4054
export const LoginRequestSchema = z.object({
41-
username: z.string().describe('Username or Email'),
42-
password: z.string().describe('Password credential'),
43-
type: z.literal('password').default('password'),
55+
type: LoginType.default('email').describe('Login method'),
56+
email: z.string().email().optional().describe('Required for email/magic-link'),
57+
username: z.string().optional().describe('Required for username login'),
58+
password: z.string().optional().describe('Required for password login'),
59+
provider: z.string().optional().describe('Required for social (google, github)'),
60+
redirectTo: z.string().optional().describe('Redirect URL after successful login'),
61+
});
62+
63+
export const RegisterRequestSchema = z.object({
64+
email: z.string().email(),
65+
password: z.string(),
66+
name: z.string(),
67+
image: z.string().optional(),
4468
});
4569

4670
export const RefreshTokenRequestSchema = z.object({
@@ -53,10 +77,9 @@ export const RefreshTokenRequestSchema = z.object({
5377

5478
export const SessionResponseSchema = BaseResponseSchema.extend({
5579
data: z.object({
56-
accessToken: z.string().describe('JWT Access Token'),
57-
refreshToken: z.string().optional().describe('Refresh Token (if enabled)'),
58-
expiresIn: z.number().describe('Token expiry in seconds'),
59-
user: SessionUserSchema.describe('Current user details'),
80+
session: SessionSchema.describe('Active Session Info'),
81+
user: SessionUserSchema.describe('Current User Details'),
82+
token: z.string().optional().describe('Bearer token if not using cookies'),
6083
}),
6184
});
6285

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { z } from 'zod';
2+
3+
/**
4+
* Better-Auth Configuration Protocol
5+
*
6+
* Defines the configuration required to initialize the Better-Auth kernel.
7+
* Used in server-side configuration injection.
8+
*/
9+
10+
export const AuthProviderConfigSchema = z.object({
11+
id: z.string().describe('Provider ID (github, google)'),
12+
clientId: z.string().describe('OAuth Client ID'),
13+
clientSecret: z.string().describe('OAuth Client Secret'),
14+
scope: z.array(z.string()).optional().describe('Requested permissions'),
15+
});
16+
17+
export const AuthPluginConfigSchema = z.object({
18+
organization: z.boolean().default(false).describe('Enable Organization/Teams support'),
19+
twoFactor: z.boolean().default(false).describe('Enable 2FA'),
20+
passkeys: z.boolean().default(false).describe('Enable Passkey support'),
21+
magicLink: z.boolean().default(false).describe('Enable Magic Link login'),
22+
});
23+
24+
export const AuthConfigSchema = z.object({
25+
secret: z.string().describe('Encryption secret'),
26+
baseUrl: z.string().describe('Base URL for auth routes'),
27+
databaseUrl: z.string().optional().describe('Database connection string'),
28+
providers: z.array(AuthProviderConfigSchema).optional(),
29+
plugins: AuthPluginConfigSchema.optional(),
30+
session: z.object({
31+
expiresIn: z.number().default(60 * 60 * 24 * 7).describe('Session duration in seconds'),
32+
updateAge: z.number().default(60 * 60 * 24).describe('Session update frequency'),
33+
}).optional(),
34+
});

0 commit comments

Comments
 (0)