@artatol-acp/auth-nextjs 0.3.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,17 +3,29 @@ import { type ReactNode } from 'react';
3
3
  export type ACPAuthContextValue = {
4
4
  user: User | null;
5
5
  isLoading: boolean;
6
- login: (email: string, password: string) => Promise<void>;
6
+ login: (email: string, password: string) => Promise<{
7
+ requiresTwoFactor?: boolean;
8
+ tempToken?: string;
9
+ }>;
10
+ verify2FA: (tempToken: string, code: string) => Promise<void>;
7
11
  logout: () => Promise<void>;
8
12
  refresh: () => Promise<boolean>;
9
13
  resendVerification: (email: string) => Promise<void>;
10
14
  };
11
15
  export type ACPAuthProviderProps = {
12
16
  children: ReactNode;
13
- baseUrl: string;
17
+ /**
18
+ * Base path for auth API routes in your app.
19
+ * @default "/api/auth"
20
+ */
21
+ apiBasePath?: string;
22
+ /**
23
+ * Initial user data from server-side rendering.
24
+ * If provided, skips initial client-side session fetch.
25
+ */
26
+ initialUser?: User | null;
14
27
  };
15
- export declare function ACPAuthProvider({ children, baseUrl }: ACPAuthProviderProps): import("react/jsx-runtime").JSX.Element;
28
+ export declare function ACPAuthProvider({ children, apiBasePath, initialUser, }: ACPAuthProviderProps): import("react/jsx-runtime").JSX.Element;
16
29
  export declare function useAuth(): ACPAuthContextValue;
17
- export { ACPAuthClient } from '@artatol-acp/auth-js';
18
- export type * from '@artatol-acp/auth-js';
30
+ export type { User } from '@artatol-acp/auth-js';
19
31
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAuE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5G,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAIF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,oBAAoB,2CAuF1E;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAuE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5G,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzG,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAIF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B,CAAC;AA6BF,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,WAAyB,EACzB,WAAW,GACZ,EAAE,oBAAoB,2CAmHtB;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,YAAY,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,122 @@
1
+ /** @jsxImportSource react */
2
+ 'use client';
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { createContext, useContext, useState, useEffect, useRef, useCallback } from 'react';
5
+ const ACPAuthContext = createContext(null);
6
+ async function authFetch(path, options = {}) {
7
+ const response = await fetch(path, {
8
+ ...options,
9
+ headers: {
10
+ 'Content-Type': 'application/json',
11
+ ...options.headers,
12
+ },
13
+ credentials: 'include',
14
+ });
15
+ const data = await response.json();
16
+ if (!data.success) {
17
+ throw new Error(data.error.message);
18
+ }
19
+ return data.data;
20
+ }
21
+ export function ACPAuthProvider({ children, apiBasePath = '/api/auth', initialUser, }) {
22
+ const [user, setUser] = useState(initialUser ?? null);
23
+ const [isLoading, setIsLoading] = useState(initialUser === undefined);
24
+ const intervalRef = useRef(null);
25
+ const apiBase = apiBasePath.replace(/\/$/, '');
26
+ const clearRefreshInterval = useCallback(() => {
27
+ if (intervalRef.current) {
28
+ clearInterval(intervalRef.current);
29
+ intervalRef.current = null;
30
+ }
31
+ }, []);
32
+ const refresh = useCallback(async () => {
33
+ try {
34
+ const result = await authFetch(`${apiBase}/session`, {
35
+ method: 'POST',
36
+ });
37
+ setUser(result.user);
38
+ return true;
39
+ }
40
+ catch {
41
+ setUser(null);
42
+ return false;
43
+ }
44
+ }, [apiBase]);
45
+ const login = useCallback(async (email, password) => {
46
+ const result = await authFetch(`${apiBase}/login`, {
47
+ method: 'POST',
48
+ body: JSON.stringify({ email, password }),
49
+ });
50
+ if (result.requiresTwoFactor) {
51
+ return { requiresTwoFactor: true, tempToken: result.tempToken };
52
+ }
53
+ if (result.user) {
54
+ setUser(result.user);
55
+ }
56
+ return {};
57
+ }, [apiBase]);
58
+ const verify2FA = useCallback(async (tempToken, code) => {
59
+ const result = await authFetch(`${apiBase}/verify-2fa`, {
60
+ method: 'POST',
61
+ body: JSON.stringify({ tempToken, code }),
62
+ });
63
+ setUser(result.user);
64
+ }, [apiBase]);
65
+ const logout = useCallback(async () => {
66
+ clearRefreshInterval();
67
+ setUser(null);
68
+ try {
69
+ await authFetch(`${apiBase}/logout`, { method: 'POST' });
70
+ }
71
+ catch {
72
+ // Ignore logout errors
73
+ }
74
+ }, [apiBase, clearRefreshInterval]);
75
+ const resendVerification = useCallback(async (email) => {
76
+ await authFetch(`${apiBase}/resend-verification`, {
77
+ method: 'POST',
78
+ body: JSON.stringify({ email }),
79
+ });
80
+ }, [apiBase]);
81
+ // Initial session restore (skip if initialUser was provided)
82
+ useEffect(() => {
83
+ if (initialUser !== undefined) {
84
+ return;
85
+ }
86
+ refresh().finally(() => setIsLoading(false));
87
+ }, [refresh, initialUser]);
88
+ // Auto-refresh interval
89
+ useEffect(() => {
90
+ if (!user) {
91
+ clearRefreshInterval();
92
+ return;
93
+ }
94
+ const REFRESH_INTERVAL = 4 * 60 * 1000; // 4 minutes
95
+ intervalRef.current = setInterval(() => {
96
+ refresh().then(success => {
97
+ if (!success) {
98
+ clearRefreshInterval();
99
+ setUser(null);
100
+ }
101
+ });
102
+ }, REFRESH_INTERVAL);
103
+ return clearRefreshInterval;
104
+ }, [user, refresh, clearRefreshInterval]);
105
+ return (_jsx(ACPAuthContext.Provider, { value: {
106
+ user,
107
+ isLoading,
108
+ login,
109
+ verify2FA,
110
+ logout,
111
+ refresh,
112
+ resendVerification,
113
+ }, children: children }));
114
+ }
115
+ export function useAuth() {
116
+ const context = useContext(ACPAuthContext);
117
+ if (!context) {
118
+ throw new Error('useAuth must be used within ACPAuthProvider');
119
+ }
120
+ return context;
121
+ }
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { ACPAuthClient, type User, type FetchFunction } from '@artatol-acp/auth-js';
3
+ export type ACPAuthHandlerOptions = {
4
+ baseUrl: string;
5
+ apiKey?: string;
6
+ /**
7
+ * Cookie configuration
8
+ */
9
+ cookies?: {
10
+ /**
11
+ * Cookie path
12
+ * @default "/"
13
+ */
14
+ path?: string;
15
+ /**
16
+ * Whether to use secure cookies (HTTPS only)
17
+ * @default process.env.NODE_ENV === "production"
18
+ */
19
+ secure?: boolean;
20
+ /**
21
+ * SameSite cookie attribute
22
+ * @default "lax"
23
+ */
24
+ sameSite?: 'strict' | 'lax' | 'none';
25
+ };
26
+ };
27
+ type ApiSuccess<T> = {
28
+ success: true;
29
+ data: T;
30
+ };
31
+ type ApiError = {
32
+ success: false;
33
+ error: {
34
+ message: string;
35
+ code?: string;
36
+ };
37
+ };
38
+ export declare function createAuthHandlers(options: ACPAuthHandlerOptions): {
39
+ authHandler: (request: NextRequest, context: {
40
+ params: Promise<{
41
+ action: string;
42
+ }>;
43
+ }) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
44
+ requiresTwoFactor: boolean;
45
+ tempToken: string;
46
+ }>> | NextResponse<ApiSuccess<{
47
+ user: User;
48
+ }>> | NextResponse<ApiSuccess<{
49
+ message: string;
50
+ }>>>;
51
+ loginHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
52
+ requiresTwoFactor: boolean;
53
+ tempToken: string;
54
+ }>> | NextResponse<ApiSuccess<{
55
+ user: User;
56
+ }>>>;
57
+ verify2FAHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
58
+ user: User;
59
+ }>>>;
60
+ logoutHandler: (_request: NextRequest) => Promise<NextResponse<ApiSuccess<{
61
+ message: string;
62
+ }>>>;
63
+ sessionHandler: (_request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
64
+ user: User;
65
+ }>>>;
66
+ registerHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
67
+ user: User;
68
+ }>>>;
69
+ resendVerificationHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
70
+ message: string;
71
+ }>>>;
72
+ forgotPasswordHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
73
+ message: string;
74
+ }>>>;
75
+ resetPasswordHandler: (request: NextRequest) => Promise<NextResponse<ApiError> | NextResponse<ApiSuccess<{
76
+ message: string;
77
+ }>>>;
78
+ setAuthCookies: (accessToken: string, refreshToken?: string) => Promise<void>;
79
+ clearAuthCookies: () => Promise<void>;
80
+ getStoredTokens: () => Promise<{
81
+ accessToken: string | undefined;
82
+ refreshToken: string | undefined;
83
+ }>;
84
+ createClient: (customFetch?: FetchFunction) => ACPAuthClient;
85
+ };
86
+ export type AuthHandlers = ReturnType<typeof createAuthHandlers>;
87
+ export {};
88
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAgB,KAAK,IAAI,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAElG,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE;QACR;;;WAGG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QACd;;;WAGG;QACH,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB;;;WAGG;QACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;KACtC,CAAC;CACH,CAAC;AAEF,KAAK,UAAU,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC;AAChD,KAAK,QAAQ,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAc9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,qBAAqB;2BAyTpD,WAAW,WACX;QAAE,MAAM,EAAE,OAAO,CAAC;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;;;;;;;;4BA5Pb,WAAW;;;;;;gCAkCP,WAAW;;;8BA0Bb,WAAW;;;+BAqCV,WAAW;;;+BAsDX,WAAW;;;yCAyBD,WAAW;;;qCAyBf,WAAW;;;oCAyBZ,WAAW;;;kCA1Qb,MAAM,iBAAiB,MAAM;;;;;;iCATpC,aAAa;EAyVlD;AAGD,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,321 @@
1
+ import { cookies } from 'next/headers';
2
+ import { NextResponse } from 'next/server';
3
+ import { ACPAuthClient, ACPAuthError } from '@artatol-acp/auth-js';
4
+ function jsonResponse(data, status = 200) {
5
+ return NextResponse.json({ success: true, data }, { status });
6
+ }
7
+ function errorResponse(message, status = 400, code) {
8
+ return NextResponse.json({ success: false, error: { message, code } }, { status });
9
+ }
10
+ export function createAuthHandlers(options) {
11
+ const { baseUrl, apiKey = '', cookies: cookieConfig = {}, } = options;
12
+ const { path: cookiePath = '/', secure = process.env.NODE_ENV === 'production', sameSite = 'lax', } = cookieConfig;
13
+ function createClient(customFetch) {
14
+ return new ACPAuthClient({
15
+ baseUrl,
16
+ apiKey,
17
+ fetch: customFetch,
18
+ autoRefresh: false,
19
+ });
20
+ }
21
+ async function setAuthCookies(accessToken, refreshToken) {
22
+ const cookieStore = await cookies();
23
+ cookieStore.set('access_token', accessToken, {
24
+ httpOnly: true,
25
+ secure,
26
+ sameSite,
27
+ path: cookiePath,
28
+ maxAge: 60 * 5, // 5 minutes
29
+ });
30
+ if (refreshToken) {
31
+ cookieStore.set('refresh_token', refreshToken, {
32
+ httpOnly: true,
33
+ secure,
34
+ sameSite,
35
+ path: cookiePath,
36
+ maxAge: 60 * 60 * 24 * 30, // 30 days
37
+ });
38
+ }
39
+ }
40
+ async function clearAuthCookies() {
41
+ const cookieStore = await cookies();
42
+ cookieStore.delete('access_token');
43
+ cookieStore.delete('refresh_token');
44
+ }
45
+ async function getStoredTokens() {
46
+ const cookieStore = await cookies();
47
+ return {
48
+ accessToken: cookieStore.get('access_token')?.value,
49
+ refreshToken: cookieStore.get('refresh_token')?.value,
50
+ };
51
+ }
52
+ /**
53
+ * POST /api/auth/login
54
+ * Body: { email: string, password: string }
55
+ */
56
+ async function loginHandler(request) {
57
+ try {
58
+ const body = await request.json();
59
+ const { email, password } = body;
60
+ if (!email || !password) {
61
+ return errorResponse('Email and password are required', 400);
62
+ }
63
+ const client = createClient();
64
+ const result = await client.login({ email, password });
65
+ if ('requiresTwoFactor' in result) {
66
+ return jsonResponse({
67
+ requiresTwoFactor: true,
68
+ tempToken: result.tempToken,
69
+ });
70
+ }
71
+ await setAuthCookies(result.accessToken, result.refreshToken);
72
+ return jsonResponse({ user: result.user });
73
+ }
74
+ catch (error) {
75
+ if (error instanceof ACPAuthError) {
76
+ return errorResponse(error.message, error.statusCode, error.code);
77
+ }
78
+ return errorResponse('Login failed', 500);
79
+ }
80
+ }
81
+ /**
82
+ * POST /api/auth/verify-2fa
83
+ * Body: { tempToken: string, code: string }
84
+ */
85
+ async function verify2FAHandler(request) {
86
+ try {
87
+ const body = await request.json();
88
+ const { tempToken, code } = body;
89
+ if (!tempToken || !code) {
90
+ return errorResponse('Temp token and code are required', 400);
91
+ }
92
+ const client = createClient();
93
+ const result = await client.verify2FALogin({ tempToken, code });
94
+ await setAuthCookies(result.accessToken, result.refreshToken);
95
+ return jsonResponse({ user: result.user });
96
+ }
97
+ catch (error) {
98
+ if (error instanceof ACPAuthError) {
99
+ return errorResponse(error.message, error.statusCode, error.code);
100
+ }
101
+ return errorResponse('2FA verification failed', 500);
102
+ }
103
+ }
104
+ /**
105
+ * POST /api/auth/logout
106
+ */
107
+ async function logoutHandler(_request) {
108
+ try {
109
+ const { refreshToken } = await getStoredTokens();
110
+ if (refreshToken) {
111
+ // Create a custom fetch that includes the refresh token cookie
112
+ const customFetch = async (url, init) => {
113
+ return fetch(url, {
114
+ ...init,
115
+ headers: {
116
+ ...init?.headers,
117
+ Cookie: `refresh_token=${refreshToken}`,
118
+ },
119
+ });
120
+ };
121
+ const client = createClient(customFetch);
122
+ try {
123
+ await client.logout();
124
+ }
125
+ catch {
126
+ // Ignore logout API errors
127
+ }
128
+ }
129
+ await clearAuthCookies();
130
+ return jsonResponse({ message: 'Logged out' });
131
+ }
132
+ catch {
133
+ await clearAuthCookies();
134
+ return jsonResponse({ message: 'Logged out' });
135
+ }
136
+ }
137
+ /**
138
+ * POST /api/auth/session
139
+ * Refreshes the session and returns current user
140
+ */
141
+ async function sessionHandler(_request) {
142
+ try {
143
+ const { accessToken, refreshToken } = await getStoredTokens();
144
+ if (!accessToken && !refreshToken) {
145
+ return errorResponse('No session', 401);
146
+ }
147
+ const customFetch = async (url, init) => {
148
+ return fetch(url, {
149
+ ...init,
150
+ headers: {
151
+ ...init?.headers,
152
+ Cookie: `refresh_token=${refreshToken}`,
153
+ },
154
+ });
155
+ };
156
+ const client = createClient(customFetch);
157
+ // Try to refresh the token
158
+ try {
159
+ const refreshResult = await client.refresh();
160
+ await setAuthCookies(refreshResult.accessToken);
161
+ // Get user data with new token
162
+ const user = await client.me(refreshResult.accessToken);
163
+ return jsonResponse({ user });
164
+ }
165
+ catch {
166
+ // Refresh failed, try to use existing access token
167
+ if (accessToken) {
168
+ try {
169
+ const user = await client.me(accessToken);
170
+ return jsonResponse({ user });
171
+ }
172
+ catch {
173
+ await clearAuthCookies();
174
+ return errorResponse('Session expired', 401);
175
+ }
176
+ }
177
+ await clearAuthCookies();
178
+ return errorResponse('Session expired', 401);
179
+ }
180
+ }
181
+ catch (error) {
182
+ if (error instanceof ACPAuthError) {
183
+ return errorResponse(error.message, error.statusCode, error.code);
184
+ }
185
+ return errorResponse('Session check failed', 500);
186
+ }
187
+ }
188
+ /**
189
+ * POST /api/auth/register
190
+ * Body: { email: string, password: string }
191
+ */
192
+ async function registerHandler(request) {
193
+ try {
194
+ const body = await request.json();
195
+ const { email, password } = body;
196
+ if (!email || !password) {
197
+ return errorResponse('Email and password are required', 400);
198
+ }
199
+ const client = createClient();
200
+ const user = await client.register({ email, password });
201
+ return jsonResponse({ user });
202
+ }
203
+ catch (error) {
204
+ if (error instanceof ACPAuthError) {
205
+ return errorResponse(error.message, error.statusCode, error.code);
206
+ }
207
+ return errorResponse('Registration failed', 500);
208
+ }
209
+ }
210
+ /**
211
+ * POST /api/auth/resend-verification
212
+ * Body: { email: string }
213
+ */
214
+ async function resendVerificationHandler(request) {
215
+ try {
216
+ const body = await request.json();
217
+ const { email } = body;
218
+ if (!email) {
219
+ return errorResponse('Email is required', 400);
220
+ }
221
+ const client = createClient();
222
+ await client.resendVerificationEmail({ email });
223
+ return jsonResponse({ message: 'Verification email sent' });
224
+ }
225
+ catch (error) {
226
+ if (error instanceof ACPAuthError) {
227
+ return errorResponse(error.message, error.statusCode, error.code);
228
+ }
229
+ return errorResponse('Failed to send verification email', 500);
230
+ }
231
+ }
232
+ /**
233
+ * POST /api/auth/forgot-password
234
+ * Body: { email: string }
235
+ */
236
+ async function forgotPasswordHandler(request) {
237
+ try {
238
+ const body = await request.json();
239
+ const { email } = body;
240
+ if (!email) {
241
+ return errorResponse('Email is required', 400);
242
+ }
243
+ const client = createClient();
244
+ await client.forgotPassword({ email });
245
+ return jsonResponse({ message: 'Password reset email sent' });
246
+ }
247
+ catch (error) {
248
+ if (error instanceof ACPAuthError) {
249
+ return errorResponse(error.message, error.statusCode, error.code);
250
+ }
251
+ return errorResponse('Failed to send reset email', 500);
252
+ }
253
+ }
254
+ /**
255
+ * POST /api/auth/reset-password
256
+ * Body: { token: string, newPassword: string }
257
+ */
258
+ async function resetPasswordHandler(request) {
259
+ try {
260
+ const body = await request.json();
261
+ const { token, newPassword } = body;
262
+ if (!token || !newPassword) {
263
+ return errorResponse('Token and new password are required', 400);
264
+ }
265
+ const client = createClient();
266
+ await client.resetPassword({ token, newPassword });
267
+ return jsonResponse({ message: 'Password reset successful' });
268
+ }
269
+ catch (error) {
270
+ if (error instanceof ACPAuthError) {
271
+ return errorResponse(error.message, error.statusCode, error.code);
272
+ }
273
+ return errorResponse('Password reset failed', 500);
274
+ }
275
+ }
276
+ /**
277
+ * Main route handler that dispatches to individual handlers
278
+ */
279
+ async function authHandler(request, context) {
280
+ const { action } = await context.params;
281
+ switch (action) {
282
+ case 'login':
283
+ return loginHandler(request);
284
+ case 'verify-2fa':
285
+ return verify2FAHandler(request);
286
+ case 'logout':
287
+ return logoutHandler(request);
288
+ case 'session':
289
+ return sessionHandler(request);
290
+ case 'register':
291
+ return registerHandler(request);
292
+ case 'resend-verification':
293
+ return resendVerificationHandler(request);
294
+ case 'forgot-password':
295
+ return forgotPasswordHandler(request);
296
+ case 'reset-password':
297
+ return resetPasswordHandler(request);
298
+ default:
299
+ return errorResponse('Not found', 404);
300
+ }
301
+ }
302
+ return {
303
+ // Main combined handler
304
+ authHandler,
305
+ // Individual handlers for custom routing
306
+ loginHandler,
307
+ verify2FAHandler,
308
+ logoutHandler,
309
+ sessionHandler,
310
+ registerHandler,
311
+ resendVerificationHandler,
312
+ forgotPasswordHandler,
313
+ resetPasswordHandler,
314
+ // Utility functions
315
+ setAuthCookies,
316
+ clearAuthCookies,
317
+ getStoredTokens,
318
+ createClient,
319
+ };
320
+ }
321
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,30 @@
1
- import { ACPAuthClient, type User, type LoginResult } from '@artatol-acp/auth-js';
1
+ import { type User, type LoginResult } from '@artatol-acp/auth-js';
2
2
  export type ACPAuthServerOptions = {
3
3
  baseUrl: string;
4
- apiKey: string;
4
+ apiKey?: string;
5
5
  jwtPublicKey: string;
6
+ /**
7
+ * Cookie configuration
8
+ */
9
+ cookies?: {
10
+ /**
11
+ * Cookie path
12
+ * @default "/"
13
+ */
14
+ path?: string;
15
+ /**
16
+ * Whether to use secure cookies (HTTPS only)
17
+ * @default process.env.NODE_ENV === "production"
18
+ */
19
+ secure?: boolean;
20
+ /**
21
+ * SameSite cookie attribute
22
+ * @default "lax"
23
+ */
24
+ sameSite?: 'strict' | 'lax' | 'none';
25
+ };
6
26
  };
7
- export declare function initACPAuth(options: ACPAuthServerOptions): ACPAuthClient;
27
+ export declare function initACPAuth(options: ACPAuthServerOptions): void;
8
28
  export type JWTUser = {
9
29
  id: string;
10
30
  email: string;
@@ -13,6 +33,9 @@ export declare function verifyAccessToken(token: string): Promise<JWTUser>;
13
33
  export declare function getUser(): Promise<JWTUser | null>;
14
34
  export declare function refreshAccessToken(): Promise<string | null>;
15
35
  export declare function login(email: string, password: string): Promise<LoginResult>;
36
+ export declare function verify2FALogin(tempToken: string, code: string): Promise<{
37
+ user: User;
38
+ }>;
16
39
  export declare function logout(): Promise<void>;
17
40
  export declare function register(email: string, password: string): Promise<User>;
18
41
  export declare function verifyEmail(token: string): Promise<{
@@ -31,6 +54,6 @@ export declare function resetPassword(token: string, newPassword: string): Promi
31
54
  export declare function deleteAccount(password: string, confirmation: string): Promise<{
32
55
  message: string;
33
56
  }>;
34
- export { ACPAuthClient } from '@artatol-acp/auth-js';
57
+ export { ACPAuthClient, ACPAuthError } from '@artatol-acp/auth-js';
35
58
  export type * from '@artatol-acp/auth-js';
36
59
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGlF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAMF,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAOxE;AAqBD,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAevE;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAavD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAoBjE;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiBjF;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAW5C;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAG7E;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGzF;AAED,wBAAsB,EAAE,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAe/C;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGhF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGpG;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBxG;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGlF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE;QACR;;;WAGG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QACd;;;WAGG;QACH,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB;;;WAGG;QACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;KACtC,CAAC;CACH,CAAC;AAKF,wBAAgB,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE/D;AA+DD,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAevE;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAavD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBjE;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2BjF;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CAyBzB;AAED,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAU5C;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAG7E;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGzF;AAED,wBAAsB,EAAE,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAe/C;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGhF;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAGpG;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBxG;AAGD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnE,mBAAmB,sBAAsB,CAAC"}