@revealui/auth 0.2.0 → 0.3.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.
- package/README.md +58 -34
- package/dist/index.d.ts.map +1 -1
- package/dist/react/index.d.ts +4 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +2 -0
- package/dist/react/useMFA.d.ts +83 -0
- package/dist/react/useMFA.d.ts.map +1 -0
- package/dist/react/useMFA.js +182 -0
- package/dist/react/usePasskey.d.ts +88 -0
- package/dist/react/usePasskey.d.ts.map +1 -0
- package/dist/react/usePasskey.js +203 -0
- package/dist/react/useSession.d.ts.map +1 -1
- package/dist/react/useSession.js +16 -5
- package/dist/react/useSignIn.d.ts +9 -3
- package/dist/react/useSignIn.d.ts.map +1 -1
- package/dist/react/useSignIn.js +32 -10
- package/dist/react/useSignOut.d.ts.map +1 -1
- package/dist/react/useSignUp.d.ts +1 -0
- package/dist/react/useSignUp.d.ts.map +1 -1
- package/dist/react/useSignUp.js +25 -9
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +93 -5
- package/dist/server/brute-force.d.ts +10 -1
- package/dist/server/brute-force.d.ts.map +1 -1
- package/dist/server/brute-force.js +46 -23
- package/dist/server/errors.d.ts +4 -0
- package/dist/server/errors.d.ts.map +1 -1
- package/dist/server/errors.js +8 -0
- package/dist/server/index.d.ts +17 -6
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +12 -5
- package/dist/server/magic-link.d.ts +52 -0
- package/dist/server/magic-link.d.ts.map +1 -0
- package/dist/server/magic-link.js +111 -0
- package/dist/server/mfa.d.ts +87 -0
- package/dist/server/mfa.d.ts.map +1 -0
- package/dist/server/mfa.js +263 -0
- package/dist/server/oauth.d.ts +86 -0
- package/dist/server/oauth.d.ts.map +1 -0
- package/dist/server/oauth.js +355 -0
- package/dist/server/passkey.d.ts +132 -0
- package/dist/server/passkey.d.ts.map +1 -0
- package/dist/server/passkey.js +257 -0
- package/dist/server/password-reset.d.ts +32 -6
- package/dist/server/password-reset.d.ts.map +1 -1
- package/dist/server/password-reset.js +116 -47
- package/dist/server/password-validation.d.ts.map +1 -1
- package/dist/server/providers/github.d.ts +14 -0
- package/dist/server/providers/github.d.ts.map +1 -0
- package/dist/server/providers/github.js +89 -0
- package/dist/server/providers/google.d.ts +11 -0
- package/dist/server/providers/google.d.ts.map +1 -0
- package/dist/server/providers/google.js +69 -0
- package/dist/server/providers/vercel.d.ts +11 -0
- package/dist/server/providers/vercel.d.ts.map +1 -0
- package/dist/server/providers/vercel.js +63 -0
- package/dist/server/rate-limit.d.ts +10 -1
- package/dist/server/rate-limit.d.ts.map +1 -1
- package/dist/server/rate-limit.js +61 -43
- package/dist/server/session.d.ts +48 -1
- package/dist/server/session.d.ts.map +1 -1
- package/dist/server/session.js +126 -7
- package/dist/server/signed-cookie.d.ts +32 -0
- package/dist/server/signed-cookie.d.ts.map +1 -0
- package/dist/server/signed-cookie.js +67 -0
- package/dist/server/storage/database.d.ts +10 -1
- package/dist/server/storage/database.d.ts.map +1 -1
- package/dist/server/storage/database.js +43 -5
- package/dist/server/storage/in-memory.d.ts +4 -0
- package/dist/server/storage/in-memory.d.ts.map +1 -1
- package/dist/server/storage/in-memory.js +16 -6
- package/dist/server/storage/index.d.ts +11 -3
- package/dist/server/storage/index.d.ts.map +1 -1
- package/dist/server/storage/index.js +18 -4
- package/dist/server/storage/interface.d.ts +11 -1
- package/dist/server/storage/interface.d.ts.map +1 -1
- package/dist/server/storage/interface.js +1 -1
- package/dist/types.d.ts +23 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/dist/utils/database.d.ts.map +1 -1
- package/dist/utils/database.js +12 -2
- package/dist/utils/token.d.ts +9 -1
- package/dist/utils/token.d.ts.map +1 -1
- package/dist/utils/token.js +9 -1
- package/package.json +26 -8
package/dist/types.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Auth Types
|
|
3
3
|
*
|
|
4
4
|
* Type definitions for authentication system.
|
|
5
|
-
* Uses concrete interfaces instead of z.infer<> aliases
|
|
6
|
-
*
|
|
5
|
+
* Uses concrete interfaces instead of z.infer<> aliases for
|
|
6
|
+
* clear type definitions and better IDE support.
|
|
7
7
|
*/
|
|
8
8
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/utils/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/utils/database.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAU3C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,2CAMvC;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B7E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,OAAO,CAAC,CAuBlB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CASxE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAStF;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CASf;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,aAAa,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,EAC7B,gBAAgB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAClC,OAAO,CAAC;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAI3C"}
|
package/dist/utils/database.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { getClient } from '@revealui/db/client';
|
|
8
8
|
import { sessions, users } from '@revealui/db/schema';
|
|
9
|
-
import { eq } from 'drizzle-orm';
|
|
9
|
+
import { and, eq, isNull } from 'drizzle-orm';
|
|
10
10
|
/**
|
|
11
11
|
* Gets the test database connection string from environment variables
|
|
12
12
|
*/
|
|
@@ -66,6 +66,11 @@ export async function createTestUser(overrides) {
|
|
|
66
66
|
agentModel: null,
|
|
67
67
|
agentCapabilities: null,
|
|
68
68
|
agentConfig: null,
|
|
69
|
+
emailVerified: false,
|
|
70
|
+
emailVerificationToken: null,
|
|
71
|
+
emailVerifiedAt: null,
|
|
72
|
+
mfaEnabled: false,
|
|
73
|
+
mfaVerifiedAt: null,
|
|
69
74
|
preferences: null,
|
|
70
75
|
createdAt: new Date(),
|
|
71
76
|
updatedAt: new Date(),
|
|
@@ -93,6 +98,7 @@ export async function createTestSession(userId, overrides) {
|
|
|
93
98
|
persistent: overrides?.persistent ?? null,
|
|
94
99
|
lastActivityAt: overrides?.lastActivityAt || new Date(),
|
|
95
100
|
createdAt: overrides?.createdAt || new Date(),
|
|
101
|
+
metadata: overrides?.metadata ?? null,
|
|
96
102
|
};
|
|
97
103
|
await db.insert(sessions).values(testSession);
|
|
98
104
|
return testSession;
|
|
@@ -102,7 +108,11 @@ export async function createTestSession(userId, overrides) {
|
|
|
102
108
|
*/
|
|
103
109
|
export async function getUserByEmail(email) {
|
|
104
110
|
const db = getClient();
|
|
105
|
-
const result = await db
|
|
111
|
+
const result = await db
|
|
112
|
+
.select()
|
|
113
|
+
.from(users)
|
|
114
|
+
.where(and(eq(users.email, email), isNull(users.deletedAt)))
|
|
115
|
+
.limit(1);
|
|
106
116
|
const user = result[0];
|
|
107
117
|
return user ?? null;
|
|
108
118
|
}
|
package/dist/utils/token.d.ts
CHANGED
|
@@ -5,7 +5,15 @@
|
|
|
5
5
|
* Uses SHA-256 for fast hashing (sessions are short-lived).
|
|
6
6
|
*/
|
|
7
7
|
/**
|
|
8
|
-
* Hash a session token
|
|
8
|
+
* Hash a session token using SHA-256.
|
|
9
|
+
*
|
|
10
|
+
* SHA-256 is appropriate for high-entropy session tokens (256-bit / 32 random bytes).
|
|
11
|
+
* Unlike passwords (low entropy, user-chosen), these tokens have sufficient keyspace
|
|
12
|
+
* (~2^256) to make brute-force infeasible even with fast hashes. Using bcrypt/argon2
|
|
13
|
+
* would add ~100ms latency per request with no meaningful security benefit.
|
|
14
|
+
*
|
|
15
|
+
* Security relies on: (1) token entropy >= 128 bits, (2) session expiry enforcement,
|
|
16
|
+
* (3) token regeneration on privilege changes.
|
|
9
17
|
*
|
|
10
18
|
* @param token - Plain session token
|
|
11
19
|
* @returns Hashed token (SHA-256)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/utils/token.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/utils/token.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhE"}
|
package/dist/utils/token.js
CHANGED
|
@@ -6,7 +6,15 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
8
8
|
/**
|
|
9
|
-
* Hash a session token
|
|
9
|
+
* Hash a session token using SHA-256.
|
|
10
|
+
*
|
|
11
|
+
* SHA-256 is appropriate for high-entropy session tokens (256-bit / 32 random bytes).
|
|
12
|
+
* Unlike passwords (low entropy, user-chosen), these tokens have sufficient keyspace
|
|
13
|
+
* (~2^256) to make brute-force infeasible even with fast hashes. Using bcrypt/argon2
|
|
14
|
+
* would add ~100ms latency per request with no meaningful security benefit.
|
|
15
|
+
*
|
|
16
|
+
* Security relies on: (1) token entropy >= 128 bits, (2) session expiry enforcement,
|
|
17
|
+
* (3) token regeneration on privilege changes.
|
|
10
18
|
*
|
|
11
19
|
* @param token - Plain session token
|
|
12
20
|
* @returns Hashed token (SHA-256)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revealui/auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Authentication system for RevealUI - database-backed sessions with Better Auth patterns",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"auth",
|
|
@@ -10,24 +10,35 @@
|
|
|
10
10
|
],
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
+
"@simplewebauthn/server": "^13.3.0",
|
|
13
14
|
"bcryptjs": "^3.0.3",
|
|
14
15
|
"drizzle-orm": "^0.45.1",
|
|
15
|
-
"zod": "^4.3.
|
|
16
|
-
"@revealui/
|
|
17
|
-
"@revealui/
|
|
18
|
-
"@revealui/
|
|
19
|
-
"@revealui/
|
|
16
|
+
"zod": "^4.3.6",
|
|
17
|
+
"@revealui/core": "0.3.0",
|
|
18
|
+
"@revealui/db": "0.3.0",
|
|
19
|
+
"@revealui/config": "0.3.0",
|
|
20
|
+
"@revealui/contracts": "1.2.0"
|
|
20
21
|
},
|
|
21
22
|
"devDependencies": {
|
|
23
|
+
"@simplewebauthn/browser": "^13.3.0",
|
|
24
|
+
"@testing-library/react": "^16.3.2",
|
|
22
25
|
"@types/node": "^25.3.0",
|
|
23
26
|
"@types/react": "^19.2.14",
|
|
24
27
|
"@vitest/coverage-v8": "^4.0.18",
|
|
28
|
+
"happy-dom": "^20.8.4",
|
|
25
29
|
"react": "^19.2.3",
|
|
26
30
|
"typescript": "^5.9.3",
|
|
27
31
|
"vitest": "^4.0.18",
|
|
28
32
|
"dev": "0.0.1"
|
|
29
33
|
},
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=24.13.0"
|
|
36
|
+
},
|
|
30
37
|
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"import": "./dist/index.js"
|
|
41
|
+
},
|
|
31
42
|
"./server": {
|
|
32
43
|
"types": "./dist/server/index.d.ts",
|
|
33
44
|
"import": "./dist/server/index.js"
|
|
@@ -44,22 +55,29 @@
|
|
|
44
55
|
"files": [
|
|
45
56
|
"dist"
|
|
46
57
|
],
|
|
58
|
+
"main": "./dist/index.js",
|
|
47
59
|
"peerDependencies": {
|
|
60
|
+
"@simplewebauthn/browser": "^13.0.0",
|
|
48
61
|
"react": "^18.0.0 || ^19.0.0"
|
|
49
62
|
},
|
|
63
|
+
"peerDependenciesMeta": {
|
|
64
|
+
"@simplewebauthn/browser": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
},
|
|
50
68
|
"publishConfig": {
|
|
51
69
|
"access": "public",
|
|
52
70
|
"registry": "https://registry.npmjs.org"
|
|
53
71
|
},
|
|
54
72
|
"type": "module",
|
|
73
|
+
"types": "./dist/index.d.ts",
|
|
55
74
|
"scripts": {
|
|
56
75
|
"build": "tsc",
|
|
57
76
|
"clean": "rm -rf dist",
|
|
58
77
|
"dev": "tsc --watch",
|
|
59
78
|
"lint": "biome check .",
|
|
60
|
-
"lint:eslint": "eslint .",
|
|
61
79
|
"test": "vitest run",
|
|
62
|
-
"test:coverage": "vitest run --coverage",
|
|
80
|
+
"test:coverage": "vitest run --coverage --coverage.reporter=json-summary --coverage.reporter=html --coverage.reporter=text",
|
|
63
81
|
"test:watch": "vitest",
|
|
64
82
|
"typecheck": "tsc --noEmit"
|
|
65
83
|
}
|