@artatol-acp/auth-nextjs 0.2.0 → 0.3.2
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.
- package/README.md +242 -0
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.jsx +5 -1
- package/dist/client/index.jsx.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +1 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +2 -1
- package/dist/middleware.js.map +1 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +30 -0
- package/dist/server/index.js.map +1 -0
- package/package.json +15 -21
package/README.md
CHANGED
|
@@ -334,6 +334,9 @@ NEXT_PUBLIC_ACP_AUTH_URL=https://sso.artatol.com
|
|
|
334
334
|
- `register(email, password)` - Register new user (sends verification email)
|
|
335
335
|
- `verifyEmail(token)` - Verify user's email address
|
|
336
336
|
- `resendVerificationEmail(email)` - Resend verification email
|
|
337
|
+
- `forgotPassword(email)` - Request password reset email
|
|
338
|
+
- `resetPassword(token, newPassword)` - Reset password using token from email
|
|
339
|
+
- `deleteAccount(password, confirmation)` - Delete authenticated user's account
|
|
337
340
|
|
|
338
341
|
### Client Hooks
|
|
339
342
|
|
|
@@ -343,6 +346,245 @@ NEXT_PUBLIC_ACP_AUTH_URL=https://sso.artatol.com
|
|
|
343
346
|
|
|
344
347
|
- `createACPAuthMiddleware(options)` - Create middleware for route protection
|
|
345
348
|
|
|
349
|
+
## 2FA (Two-Factor Authentication)
|
|
350
|
+
|
|
351
|
+
### Setup 2FA
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
'use server';
|
|
355
|
+
|
|
356
|
+
import { ACPAuthClient } from '@artatol-acp/auth-nextjs/server';
|
|
357
|
+
|
|
358
|
+
export async function setup2FAAction(password: string) {
|
|
359
|
+
const client = new ACPAuthClient({
|
|
360
|
+
baseUrl: process.env.ACP_AUTH_URL!,
|
|
361
|
+
apiKey: process.env.ACP_AUTH_API_KEY!,
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
const accessToken = // ... get from session/cookie
|
|
365
|
+
|
|
366
|
+
const { secret, qrCodeUrl, recoveryCodes } = await client.setup2FA(
|
|
367
|
+
{ password },
|
|
368
|
+
accessToken
|
|
369
|
+
);
|
|
370
|
+
|
|
371
|
+
return { qrCodeUrl, recoveryCodes };
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Verify 2FA Setup
|
|
376
|
+
|
|
377
|
+
```typescript
|
|
378
|
+
'use server';
|
|
379
|
+
|
|
380
|
+
export async function verify2FAAction(code: string) {
|
|
381
|
+
const client = new ACPAuthClient({
|
|
382
|
+
baseUrl: process.env.ACP_AUTH_URL!,
|
|
383
|
+
apiKey: process.env.ACP_AUTH_API_KEY!,
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
const accessToken = // ... get from session/cookie
|
|
387
|
+
|
|
388
|
+
await client.verify2FA({ code }, accessToken);
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Complete 2FA Login Flow
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
'use server';
|
|
396
|
+
|
|
397
|
+
import { login } from '@artatol-acp/auth-nextjs/server';
|
|
398
|
+
|
|
399
|
+
export async function loginAction(email: string, password: string) {
|
|
400
|
+
const result = await login(email, password);
|
|
401
|
+
|
|
402
|
+
if ('requiresTwoFactor' in result) {
|
|
403
|
+
// User has 2FA enabled
|
|
404
|
+
return {
|
|
405
|
+
requires2FA: true,
|
|
406
|
+
tempToken: result.tempToken,
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// Regular login successful
|
|
411
|
+
return { success: true };
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
export async function complete2FALogin(tempToken: string, code: string) {
|
|
415
|
+
const client = new ACPAuthClient({
|
|
416
|
+
baseUrl: process.env.ACP_AUTH_URL!,
|
|
417
|
+
apiKey: process.env.ACP_AUTH_API_KEY!,
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
const result = await client.verify2FALogin({ tempToken, code });
|
|
421
|
+
// Set cookies, etc.
|
|
422
|
+
return result;
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### Disable 2FA
|
|
427
|
+
|
|
428
|
+
```typescript
|
|
429
|
+
'use server';
|
|
430
|
+
|
|
431
|
+
export async function disable2FAAction(password: string, code: string) {
|
|
432
|
+
const client = new ACPAuthClient({
|
|
433
|
+
baseUrl: process.env.ACP_AUTH_URL!,
|
|
434
|
+
apiKey: process.env.ACP_AUTH_API_KEY!,
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
const accessToken = // ... get from session/cookie
|
|
438
|
+
|
|
439
|
+
await client.disable2FA({ password, code }, accessToken);
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
## Password Reset
|
|
444
|
+
|
|
445
|
+
### Forgot Password
|
|
446
|
+
|
|
447
|
+
Request a password reset email:
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
'use server';
|
|
451
|
+
|
|
452
|
+
import { forgotPassword } from '@artatol-acp/auth-nextjs/server';
|
|
453
|
+
|
|
454
|
+
export async function forgotPasswordAction(formData: FormData) {
|
|
455
|
+
const email = formData.get('email') as string;
|
|
456
|
+
|
|
457
|
+
await forgotPassword(email);
|
|
458
|
+
// Always succeeds to prevent email enumeration
|
|
459
|
+
return { message: 'If the email exists, a reset link has been sent' };
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### Reset Password
|
|
464
|
+
|
|
465
|
+
Reset password using the token from the email:
|
|
466
|
+
|
|
467
|
+
```typescript
|
|
468
|
+
'use server';
|
|
469
|
+
|
|
470
|
+
import { resetPassword } from '@artatol-acp/auth-nextjs/server';
|
|
471
|
+
import { redirect } from 'next/navigation';
|
|
472
|
+
|
|
473
|
+
export async function resetPasswordAction(formData: FormData) {
|
|
474
|
+
const token = formData.get('token') as string;
|
|
475
|
+
const newPassword = formData.get('password') as string;
|
|
476
|
+
|
|
477
|
+
try {
|
|
478
|
+
await resetPassword(token, newPassword);
|
|
479
|
+
redirect('/login?reset=success');
|
|
480
|
+
} catch (error) {
|
|
481
|
+
return { error: 'Invalid or expired reset token' };
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
### Client Component Example
|
|
487
|
+
|
|
488
|
+
```typescript
|
|
489
|
+
'use client';
|
|
490
|
+
|
|
491
|
+
import { useState } from 'react';
|
|
492
|
+
import { forgotPasswordAction } from './actions';
|
|
493
|
+
|
|
494
|
+
export function ForgotPasswordForm() {
|
|
495
|
+
const [submitted, setSubmitted] = useState(false);
|
|
496
|
+
|
|
497
|
+
const handleSubmit = async (formData: FormData) => {
|
|
498
|
+
await forgotPasswordAction(formData);
|
|
499
|
+
setSubmitted(true);
|
|
500
|
+
};
|
|
501
|
+
|
|
502
|
+
if (submitted) {
|
|
503
|
+
return <p>Check your email for a password reset link.</p>;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
return (
|
|
507
|
+
<form action={handleSubmit}>
|
|
508
|
+
<input name="email" type="email" placeholder="Email" required />
|
|
509
|
+
<button type="submit">Send Reset Link</button>
|
|
510
|
+
</form>
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
## Delete Account
|
|
516
|
+
|
|
517
|
+
Delete the authenticated user's account:
|
|
518
|
+
|
|
519
|
+
```typescript
|
|
520
|
+
'use server';
|
|
521
|
+
|
|
522
|
+
import { deleteAccount } from '@artatol-acp/auth-nextjs/server';
|
|
523
|
+
import { redirect } from 'next/navigation';
|
|
524
|
+
|
|
525
|
+
export async function deleteAccountAction(formData: FormData) {
|
|
526
|
+
const password = formData.get('password') as string;
|
|
527
|
+
const confirmation = formData.get('confirmation') as string;
|
|
528
|
+
|
|
529
|
+
try {
|
|
530
|
+
await deleteAccount(password, confirmation);
|
|
531
|
+
redirect('/goodbye');
|
|
532
|
+
} catch (error) {
|
|
533
|
+
return { error: 'Failed to delete account. Check your password.' };
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
**Note:** The `confirmation` parameter must be the string `"DELETE"` to confirm account deletion.
|
|
539
|
+
|
|
540
|
+
## Health Check
|
|
541
|
+
|
|
542
|
+
To check if the auth service is available:
|
|
543
|
+
|
|
544
|
+
```typescript
|
|
545
|
+
import { ACPAuthClient } from '@artatol-acp/auth-nextjs/server';
|
|
546
|
+
|
|
547
|
+
const client = new ACPAuthClient({
|
|
548
|
+
baseUrl: process.env.ACP_AUTH_URL!,
|
|
549
|
+
apiKey: process.env.ACP_AUTH_API_KEY!,
|
|
550
|
+
});
|
|
551
|
+
|
|
552
|
+
const health = await client.health();
|
|
553
|
+
console.log(health); // { status: 'ok', timestamp: '...' }
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
## Error Handling
|
|
557
|
+
|
|
558
|
+
```typescript
|
|
559
|
+
import { ACPAuthError } from '@artatol-acp/auth-js';
|
|
560
|
+
|
|
561
|
+
try {
|
|
562
|
+
await login(email, password);
|
|
563
|
+
} catch (error) {
|
|
564
|
+
if (error instanceof ACPAuthError) {
|
|
565
|
+
console.error('Auth error:', error.message);
|
|
566
|
+
console.error('Status code:', error.statusCode);
|
|
567
|
+
|
|
568
|
+
if (error.statusCode === 401) {
|
|
569
|
+
// Invalid credentials
|
|
570
|
+
} else if (error.statusCode === 429) {
|
|
571
|
+
// Rate limited
|
|
572
|
+
}
|
|
573
|
+
} else {
|
|
574
|
+
console.error('Unexpected error:', error);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
### Common Error Codes
|
|
580
|
+
|
|
581
|
+
| Status Code | Meaning |
|
|
582
|
+
|-------------|---------|
|
|
583
|
+
| 401 | Unauthorized (invalid credentials or token) |
|
|
584
|
+
| 403 | Forbidden (email not verified, account locked) |
|
|
585
|
+
| 429 | Too Many Requests (rate limited) |
|
|
586
|
+
| 500 | Internal Server Error |
|
|
587
|
+
|
|
346
588
|
## License
|
|
347
589
|
|
|
348
590
|
MIT
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type User } from '@artatol-acp/auth-js';
|
|
2
2
|
import { type ReactNode } from 'react';
|
|
3
3
|
export type ACPAuthContextValue = {
|
|
4
4
|
user: User | null;
|
|
@@ -6,6 +6,7 @@ export type ACPAuthContextValue = {
|
|
|
6
6
|
login: (email: string, password: string) => Promise<void>;
|
|
7
7
|
logout: () => Promise<void>;
|
|
8
8
|
refresh: () => Promise<void>;
|
|
9
|
+
resendVerification: (email: string) => Promise<void>;
|
|
9
10
|
};
|
|
10
11
|
export type ACPAuthProviderProps = {
|
|
11
12
|
children: ReactNode;
|
|
@@ -15,3 +16,4 @@ export declare function ACPAuthProvider({ children, baseUrl }: ACPAuthProviderPr
|
|
|
15
16
|
export declare function useAuth(): ACPAuthContextValue;
|
|
16
17
|
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
17
18
|
export type * from '@artatol-acp/auth-js';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,EAAkD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvF,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,IAAI,CAAC,CAAC;IAC7B,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,2CA8C1E;AAED,wBAAgB,OAAO,IAAI,mBAAmB,CAM7C;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
|
package/dist/client/index.jsx
CHANGED
|
@@ -30,11 +30,14 @@ export function ACPAuthProvider({ children, baseUrl }) {
|
|
|
30
30
|
await client.logout();
|
|
31
31
|
setUser(null);
|
|
32
32
|
};
|
|
33
|
+
const resendVerification = async (email) => {
|
|
34
|
+
await client.resendVerificationEmail({ email });
|
|
35
|
+
};
|
|
33
36
|
useEffect(() => {
|
|
34
37
|
// Try to restore session on mount
|
|
35
38
|
refresh().finally(() => setIsLoading(false));
|
|
36
39
|
}, []);
|
|
37
|
-
return (<ACPAuthContext.Provider value={{ user, isLoading, login, logout, refresh }}>
|
|
40
|
+
return (<ACPAuthContext.Provider value={{ user, isLoading, login, logout, refresh, resendVerification }}>
|
|
38
41
|
{children}
|
|
39
42
|
</ACPAuthContext.Provider>);
|
|
40
43
|
}
|
|
@@ -47,3 +50,4 @@ export function useAuth() {
|
|
|
47
50
|
}
|
|
48
51
|
// Re-export client for direct use
|
|
49
52
|
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
53
|
+
//# sourceMappingURL=index.jsx.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.jsx","sourceRoot":"","sources":["../../src/client/index.tsx"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAa,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAWvF,MAAM,cAAc,GAAG,aAAa,CAA6B,IAAI,CAAC,CAAC;AAOvE,MAAM,UAAU,eAAe,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAwB;IACzE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,iDAAiD;YACjD,kDAAkD;YAClD,4CAA4C;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,KAAK,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEvD,IAAI,mBAAmB,IAAI,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAED,8BAA8B;QAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QACjD,MAAM,MAAM,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,kCAAkC;QAClC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAC9F;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,cAAc,CAAC,QAAQ,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export * from '
|
|
3
|
-
|
|
1
|
+
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
2
|
+
export type * from '@artatol-acp/auth-js';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,mBAAmB,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
1
|
+
// This is the main entry point, but most users will import from /server, /client, or /middleware
|
|
2
|
+
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/middleware.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,IAO/B,SAAS,WAAW,oCAuC7D"}
|
package/dist/middleware.js
CHANGED
|
@@ -6,7 +6,7 @@ export function createACPAuthMiddleware(options) {
|
|
|
6
6
|
return async function acpAuthMiddleware(request) {
|
|
7
7
|
const { pathname } = request.nextUrl;
|
|
8
8
|
// Allow public paths
|
|
9
|
-
if (publicPaths.some(path => pathname.startsWith(path))) {
|
|
9
|
+
if (publicPaths.some((path) => pathname.startsWith(path))) {
|
|
10
10
|
return NextResponse.next();
|
|
11
11
|
}
|
|
12
12
|
// Check for access token
|
|
@@ -38,3 +38,4 @@ export function createACPAuthMiddleware(options) {
|
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAgB,MAAM,MAAM,CAAC;AAQ3D,IAAI,SAAS,GAAmB,IAAI,CAAC;AAErC,MAAM,UAAU,uBAAuB,CAAC,OAAiC;IACvE,MAAM,EACJ,YAAY,EACZ,WAAW,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,EAC5E,SAAS,GAAG,QAAQ,GACrB,GAAG,OAAO,CAAC;IAEZ,OAAO,KAAK,UAAU,iBAAiB,CAAC,OAAoB;QAC1D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;QAErC,qBAAqB;QACrB,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,yBAAyB;QACzB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC;QAE/D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,oBAAoB;YACpB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC;YACzB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvC,OAAO,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,sBAAsB;QACtB,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,SAAS,GAAG,MAAM,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE;gBACtC,UAAU,EAAE,CAAC,OAAO,CAAC;aACtB,CAAC,CAAC;YAEH,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gCAAgC;YAChC,6BAA6B;YAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACpC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC;YACzB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvC,OAAO,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -11,6 +11,22 @@ export declare function refreshAccessToken(): Promise<string | null>;
|
|
|
11
11
|
export declare function login(email: string, password: string): Promise<LoginResult>;
|
|
12
12
|
export declare function logout(): Promise<void>;
|
|
13
13
|
export declare function register(email: string, password: string): Promise<User>;
|
|
14
|
+
export declare function verifyEmail(token: string): Promise<{
|
|
15
|
+
message: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function resendVerificationEmail(email: string): Promise<{
|
|
18
|
+
message: string;
|
|
19
|
+
}>;
|
|
14
20
|
export declare function me(): Promise<User | null>;
|
|
21
|
+
export declare function forgotPassword(email: string): Promise<{
|
|
22
|
+
message: string;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function resetPassword(token: string, newPassword: string): Promise<{
|
|
25
|
+
message: string;
|
|
26
|
+
}>;
|
|
27
|
+
export declare function deleteAccount(password: string, confirmation: string): Promise<{
|
|
28
|
+
message: string;
|
|
29
|
+
}>;
|
|
15
30
|
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
16
31
|
export type * from '@artatol-acp/auth-js';
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAepE;AAED,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAapD;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"}
|
package/dist/server/index.js
CHANGED
|
@@ -106,6 +106,14 @@ export async function register(email, password) {
|
|
|
106
106
|
const client = getClient();
|
|
107
107
|
return await client.register({ email, password });
|
|
108
108
|
}
|
|
109
|
+
export async function verifyEmail(token) {
|
|
110
|
+
const client = getClient();
|
|
111
|
+
return await client.verifyEmail({ token });
|
|
112
|
+
}
|
|
113
|
+
export async function resendVerificationEmail(email) {
|
|
114
|
+
const client = getClient();
|
|
115
|
+
return await client.resendVerificationEmail({ email });
|
|
116
|
+
}
|
|
109
117
|
export async function me() {
|
|
110
118
|
const cookieStore = await cookies();
|
|
111
119
|
const accessToken = cookieStore.get('access_token')?.value;
|
|
@@ -120,5 +128,27 @@ export async function me() {
|
|
|
120
128
|
return null;
|
|
121
129
|
}
|
|
122
130
|
}
|
|
131
|
+
export async function forgotPassword(email) {
|
|
132
|
+
const client = getClient();
|
|
133
|
+
return await client.forgotPassword({ email });
|
|
134
|
+
}
|
|
135
|
+
export async function resetPassword(token, newPassword) {
|
|
136
|
+
const client = getClient();
|
|
137
|
+
return await client.resetPassword({ token, newPassword });
|
|
138
|
+
}
|
|
139
|
+
export async function deleteAccount(password, confirmation) {
|
|
140
|
+
const cookieStore = await cookies();
|
|
141
|
+
const accessToken = cookieStore.get('access_token')?.value;
|
|
142
|
+
if (!accessToken) {
|
|
143
|
+
throw new Error('Not authenticated');
|
|
144
|
+
}
|
|
145
|
+
const client = getClient();
|
|
146
|
+
const result = await client.deleteAccount({ password, confirmation }, accessToken);
|
|
147
|
+
// Clear cookies after account deletion
|
|
148
|
+
cookieStore.delete('access_token');
|
|
149
|
+
cookieStore.delete('refresh_token');
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
123
152
|
// Re-export client for direct use if needed
|
|
124
153
|
export { ACPAuthClient } from '@artatol-acp/auth-js';
|
|
154
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artatol-acp/auth-nextjs",
|
|
3
|
-
"version": "0.2
|
|
4
|
-
"description": "Next.js SDK for Artatol Cloud Platform Authentication",
|
|
3
|
+
"version": "0.3.2",
|
|
4
|
+
"description": "Next.js SDK for Artatol Cloud Platform Authentication with support for App Router, Server Actions, and Middleware",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
|
-
"module": "./dist/index.js",
|
|
8
7
|
"types": "./dist/index.d.ts",
|
|
9
8
|
"exports": {
|
|
10
9
|
".": {
|
|
@@ -16,7 +15,7 @@
|
|
|
16
15
|
"types": "./dist/server/index.d.ts"
|
|
17
16
|
},
|
|
18
17
|
"./client": {
|
|
19
|
-
"import": "./dist/client/index.
|
|
18
|
+
"import": "./dist/client/index.jsx",
|
|
20
19
|
"types": "./dist/client/index.d.ts"
|
|
21
20
|
},
|
|
22
21
|
"./middleware": {
|
|
@@ -30,29 +29,24 @@
|
|
|
30
29
|
"keywords": [
|
|
31
30
|
"acp",
|
|
32
31
|
"auth",
|
|
33
|
-
"authentication",
|
|
34
|
-
"artatol",
|
|
35
|
-
"jwt",
|
|
36
|
-
"2fa",
|
|
37
32
|
"nextjs",
|
|
38
|
-
"next
|
|
33
|
+
"next",
|
|
34
|
+
"authentication",
|
|
35
|
+
"artatol"
|
|
39
36
|
],
|
|
40
37
|
"author": "Artatol",
|
|
41
38
|
"license": "MIT",
|
|
42
|
-
"dependencies": {
|
|
43
|
-
"jose": "^6.1.3",
|
|
44
|
-
"@artatol-acp/auth-js": "0.2.0"
|
|
45
|
-
},
|
|
46
39
|
"peerDependencies": {
|
|
47
|
-
"next": "
|
|
48
|
-
"react": "
|
|
40
|
+
"next": "^14.0.0 || ^15.0.0",
|
|
41
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@artatol-acp/auth-js": "^0.3.2",
|
|
45
|
+
"jose": "^5.9.6"
|
|
49
46
|
},
|
|
50
47
|
"devDependencies": {
|
|
51
|
-
"@types/
|
|
52
|
-
"
|
|
53
|
-
"next": "^15.1.6",
|
|
54
|
-
"react": "^18.3.1",
|
|
55
|
-
"typescript": "^5.7.2"
|
|
48
|
+
"@types/react": "^18.3.0",
|
|
49
|
+
"typescript": "^5.6.3"
|
|
56
50
|
},
|
|
57
51
|
"publishConfig": {
|
|
58
52
|
"access": "public"
|
|
@@ -62,4 +56,4 @@
|
|
|
62
56
|
"dev": "tsc --watch",
|
|
63
57
|
"typecheck": "tsc --noEmit"
|
|
64
58
|
}
|
|
65
|
-
}
|
|
59
|
+
}
|