@pureq/auth 0.2.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 +293 -0
- package/dist/adapter/capabilities.d.ts +23 -0
- package/dist/adapter/capabilities.d.ts.map +1 -0
- package/dist/adapter/capabilities.js +77 -0
- package/dist/adapter/capabilities.js.map +1 -0
- package/dist/adapter/index.d.ts +12 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +121 -0
- package/dist/adapter/index.js.map +1 -0
- package/dist/adapter/sql.d.ts +36 -0
- package/dist/adapter/sql.d.ts.map +1 -0
- package/dist/adapter/sql.js +268 -0
- package/dist/adapter/sql.js.map +1 -0
- package/dist/adapters/index.d.ts +4 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +42 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/authorization/index.d.ts +8 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +49 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/bridge/index.d.ts +23 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +124 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/callbacks/index.d.ts +8 -0
- package/dist/callbacks/index.d.ts.map +1 -0
- package/dist/callbacks/index.js +53 -0
- package/dist/callbacks/index.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +481 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/kit.d.ts +7 -0
- package/dist/core/kit.d.ts.map +1 -0
- package/dist/core/kit.js +145 -0
- package/dist/core/kit.js.map +1 -0
- package/dist/core/starter.d.ts +28 -0
- package/dist/core/starter.d.ts.map +1 -0
- package/dist/core/starter.js +67 -0
- package/dist/core/starter.js.map +1 -0
- package/dist/csrf/index.d.ts +7 -0
- package/dist/csrf/index.d.ts.map +1 -0
- package/dist/csrf/index.js +126 -0
- package/dist/csrf/index.js.map +1 -0
- package/dist/debug/index.d.ts +8 -0
- package/dist/debug/index.d.ts.map +1 -0
- package/dist/debug/index.js +21 -0
- package/dist/debug/index.js.map +1 -0
- package/dist/encryption/index.d.ts +8 -0
- package/dist/encryption/index.d.ts.map +1 -0
- package/dist/encryption/index.js +43 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/events/index.d.ts +22 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +53 -0
- package/dist/events/index.js.map +1 -0
- package/dist/framework/index.d.ts +10 -0
- package/dist/framework/index.d.ts.map +1 -0
- package/dist/framework/index.js +68 -0
- package/dist/framework/index.js.map +1 -0
- package/dist/framework/packs.d.ts +54 -0
- package/dist/framework/packs.d.ts.map +1 -0
- package/dist/framework/packs.js +124 -0
- package/dist/framework/packs.js.map +1 -0
- package/dist/framework/recipes.d.ts +6 -0
- package/dist/framework/recipes.d.ts.map +1 -0
- package/dist/framework/recipes.js +108 -0
- package/dist/framework/recipes.js.map +1 -0
- package/dist/hooks/index.d.ts +11 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +95 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/react.d.ts +9 -0
- package/dist/hooks/react.d.ts.map +1 -0
- package/dist/hooks/react.js +24 -0
- package/dist/hooks/react.js.map +1 -0
- package/dist/hooks/vue.d.ts +4 -0
- package/dist/hooks/vue.d.ts.map +1 -0
- package/dist/hooks/vue.js +32 -0
- package/dist/hooks/vue.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt/index.d.ts +13 -0
- package/dist/jwt/index.d.ts.map +1 -0
- package/dist/jwt/index.js +82 -0
- package/dist/jwt/index.js.map +1 -0
- package/dist/middleware/authBasic.d.ts +5 -0
- package/dist/middleware/authBasic.d.ts.map +1 -0
- package/dist/middleware/authBasic.js +25 -0
- package/dist/middleware/authBasic.js.map +1 -0
- package/dist/middleware/authBearer.d.ts +4 -0
- package/dist/middleware/authBearer.d.ts.map +1 -0
- package/dist/middleware/authBearer.js +26 -0
- package/dist/middleware/authBearer.js.map +1 -0
- package/dist/middleware/authCustom.d.ts +4 -0
- package/dist/middleware/authCustom.d.ts.map +1 -0
- package/dist/middleware/authCustom.js +22 -0
- package/dist/middleware/authCustom.js.map +1 -0
- package/dist/middleware/authRefresh.d.ts +4 -0
- package/dist/middleware/authRefresh.d.ts.map +1 -0
- package/dist/middleware/authRefresh.js +68 -0
- package/dist/middleware/authRefresh.js.map +1 -0
- package/dist/middleware/authSession.d.ts +5 -0
- package/dist/middleware/authSession.d.ts.map +1 -0
- package/dist/middleware/authSession.js +35 -0
- package/dist/middleware/authSession.js.map +1 -0
- package/dist/middleware/broadcastSync.d.ts +7 -0
- package/dist/middleware/broadcastSync.d.ts.map +1 -0
- package/dist/middleware/broadcastSync.js +36 -0
- package/dist/middleware/broadcastSync.js.map +1 -0
- package/dist/middleware/common.d.ts +3 -0
- package/dist/middleware/common.d.ts.map +1 -0
- package/dist/middleware/common.js +10 -0
- package/dist/middleware/common.js.map +1 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +8 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/tokenLifecycle.d.ts +4 -0
- package/dist/middleware/tokenLifecycle.d.ts.map +1 -0
- package/dist/middleware/tokenLifecycle.js +52 -0
- package/dist/middleware/tokenLifecycle.js.map +1 -0
- package/dist/migration/index.d.ts +40 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +136 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/oidc/index.d.ts +25 -0
- package/dist/oidc/index.d.ts.map +1 -0
- package/dist/oidc/index.js +392 -0
- package/dist/oidc/index.js.map +1 -0
- package/dist/oidc/providers.d.ts +21 -0
- package/dist/oidc/providers.d.ts.map +1 -0
- package/dist/oidc/providers.js +51 -0
- package/dist/oidc/providers.js.map +1 -0
- package/dist/presets/index.d.ts +13 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +12 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/providers/callbackContracts.d.ts +14 -0
- package/dist/providers/callbackContracts.d.ts.map +1 -0
- package/dist/providers/callbackContracts.js +14 -0
- package/dist/providers/callbackContracts.js.map +1 -0
- package/dist/providers/errors.d.ts +9 -0
- package/dist/providers/errors.d.ts.map +1 -0
- package/dist/providers/errors.js +66 -0
- package/dist/providers/errors.js.map +1 -0
- package/dist/providers/index.d.ts +28 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +29 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/presets.d.ts +17 -0
- package/dist/providers/presets.d.ts.map +1 -0
- package/dist/providers/presets.js +84 -0
- package/dist/providers/presets.js.map +1 -0
- package/dist/revocation/index.d.ts +10 -0
- package/dist/revocation/index.d.ts.map +1 -0
- package/dist/revocation/index.js +182 -0
- package/dist/revocation/index.js.map +1 -0
- package/dist/session/exporters.d.ts +15 -0
- package/dist/session/exporters.d.ts.map +1 -0
- package/dist/session/exporters.js +62 -0
- package/dist/session/exporters.js.map +1 -0
- package/dist/session/index.d.ts +11 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +324 -0
- package/dist/session/index.js.map +1 -0
- package/dist/shared/encoding.d.ts +5 -0
- package/dist/shared/encoding.d.ts.map +1 -0
- package/dist/shared/encoding.js +27 -0
- package/dist/shared/encoding.js.map +1 -0
- package/dist/shared/errors.d.ts +13 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +12 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/index.d.ts +5 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +5 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/types.d.ts +585 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +2 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/values.d.ts +3 -0
- package/dist/shared/values.d.ts.map +1 -0
- package/dist/shared/values.js +23 -0
- package/dist/shared/values.js.map +1 -0
- package/dist/storage/index.d.ts +44 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +318 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/templates/index.d.ts +9 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +146 -0
- package/dist/templates/index.js.map +1 -0
- package/package.json +173 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
const DEFAULT_TABLES = {
|
|
2
|
+
users: "auth_users",
|
|
3
|
+
accounts: "auth_accounts",
|
|
4
|
+
sessions: "auth_sessions",
|
|
5
|
+
verificationTokens: "auth_verification_tokens",
|
|
6
|
+
};
|
|
7
|
+
function isSafeIdentifier(name) {
|
|
8
|
+
return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name);
|
|
9
|
+
}
|
|
10
|
+
function resolveTableNames(partial) {
|
|
11
|
+
const merged = {
|
|
12
|
+
users: partial?.users ?? DEFAULT_TABLES.users,
|
|
13
|
+
accounts: partial?.accounts ?? DEFAULT_TABLES.accounts,
|
|
14
|
+
sessions: partial?.sessions ?? DEFAULT_TABLES.sessions,
|
|
15
|
+
verificationTokens: partial?.verificationTokens ?? DEFAULT_TABLES.verificationTokens,
|
|
16
|
+
};
|
|
17
|
+
for (const name of Object.values(merged)) {
|
|
18
|
+
if (!isSafeIdentifier(name)) {
|
|
19
|
+
throw new Error(`pureq: invalid table name: ${name}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return merged;
|
|
23
|
+
}
|
|
24
|
+
function toDate(value) {
|
|
25
|
+
if (value instanceof Date) {
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
if (typeof value === "string" || typeof value === "number") {
|
|
29
|
+
return new Date(value);
|
|
30
|
+
}
|
|
31
|
+
return new Date(0);
|
|
32
|
+
}
|
|
33
|
+
function normalizeNullableString(value) {
|
|
34
|
+
return typeof value === "string" ? value : null;
|
|
35
|
+
}
|
|
36
|
+
function now() {
|
|
37
|
+
return new Date();
|
|
38
|
+
}
|
|
39
|
+
function createId() {
|
|
40
|
+
if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
|
|
41
|
+
return crypto.randomUUID();
|
|
42
|
+
}
|
|
43
|
+
return `user_${Math.random().toString(36).slice(2)}_${Date.now()}`;
|
|
44
|
+
}
|
|
45
|
+
function rowToUser(row) {
|
|
46
|
+
return {
|
|
47
|
+
id: String(row.id),
|
|
48
|
+
email: normalizeNullableString(row.email),
|
|
49
|
+
emailVerified: row.email_verified == null ? null : toDate(row.email_verified),
|
|
50
|
+
name: normalizeNullableString(row.name),
|
|
51
|
+
image: normalizeNullableString(row.image),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function rowToSession(row) {
|
|
55
|
+
return {
|
|
56
|
+
sessionToken: String(row.session_token),
|
|
57
|
+
userId: String(row.user_id),
|
|
58
|
+
expiresAt: toDate(row.expires_at),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function mapAccountType(value) {
|
|
62
|
+
if (value === "oauth" || value === "oidc" || value === "credentials" || value === "email") {
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
return "oidc";
|
|
66
|
+
}
|
|
67
|
+
function placeholder(dialect, index) {
|
|
68
|
+
return dialect === "postgres" ? `$${index}` : "?";
|
|
69
|
+
}
|
|
70
|
+
function placeholders(dialect, count, start = 1) {
|
|
71
|
+
return Array.from({ length: count }, (_, i) => placeholder(dialect, i + start)).join(", ");
|
|
72
|
+
}
|
|
73
|
+
export function createPostgresExecutor(client) {
|
|
74
|
+
return {
|
|
75
|
+
async select(sql, params) {
|
|
76
|
+
const result = await client.query(sql, params);
|
|
77
|
+
return result.rows ?? [];
|
|
78
|
+
},
|
|
79
|
+
async execute(sql, params) {
|
|
80
|
+
const result = await client.query(sql, params);
|
|
81
|
+
return { affectedRows: result.rowCount ?? 0 };
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function toMySqlRows(result) {
|
|
86
|
+
if (!Array.isArray(result)) {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
return result;
|
|
90
|
+
}
|
|
91
|
+
function toMySqlAffectedRows(result) {
|
|
92
|
+
if (!result || typeof result !== "object") {
|
|
93
|
+
return 0;
|
|
94
|
+
}
|
|
95
|
+
if ("affectedRows" in result && typeof result.affectedRows === "number") {
|
|
96
|
+
return result.affectedRows;
|
|
97
|
+
}
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
export function createMySqlExecutor(client) {
|
|
101
|
+
return {
|
|
102
|
+
async select(sql, params) {
|
|
103
|
+
const [rows] = await client.execute(sql, params);
|
|
104
|
+
return toMySqlRows(rows);
|
|
105
|
+
},
|
|
106
|
+
async execute(sql, params) {
|
|
107
|
+
const [result] = await client.execute(sql, params);
|
|
108
|
+
return { affectedRows: toMySqlAffectedRows(result) };
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function createSqlAdapter(dialect, executor, options = {}) {
|
|
113
|
+
const tables = resolveTableNames(options.tableNames);
|
|
114
|
+
return {
|
|
115
|
+
async createUser(user) {
|
|
116
|
+
const id = createId();
|
|
117
|
+
const insertSql = `INSERT INTO ${tables.users} (id, email, email_verified, name, image) VALUES (${placeholders(dialect, 5)})`;
|
|
118
|
+
await executor.execute(insertSql, [id, user.email ?? null, user.emailVerified ?? null, user.name ?? null, user.image ?? null]);
|
|
119
|
+
return {
|
|
120
|
+
id,
|
|
121
|
+
email: user.email ?? null,
|
|
122
|
+
emailVerified: user.emailVerified ?? null,
|
|
123
|
+
name: user.name ?? null,
|
|
124
|
+
image: user.image ?? null,
|
|
125
|
+
};
|
|
126
|
+
},
|
|
127
|
+
async getUser(id) {
|
|
128
|
+
const sql = `SELECT id, email, email_verified, name, image FROM ${tables.users} WHERE id = ${placeholder(dialect, 1)} LIMIT 1`;
|
|
129
|
+
const rows = await executor.select(sql, [id]);
|
|
130
|
+
return rows[0] ? rowToUser(rows[0]) : null;
|
|
131
|
+
},
|
|
132
|
+
async getUserByEmail(email) {
|
|
133
|
+
const sql = `SELECT id, email, email_verified, name, image FROM ${tables.users} WHERE email = ${placeholder(dialect, 1)} LIMIT 1`;
|
|
134
|
+
const rows = await executor.select(sql, [email]);
|
|
135
|
+
return rows[0] ? rowToUser(rows[0]) : null;
|
|
136
|
+
},
|
|
137
|
+
async getUserByAccount(provider, providerAccountId) {
|
|
138
|
+
const sql = `SELECT u.id, u.email, u.email_verified, u.name, u.image FROM ${tables.accounts} a JOIN ${tables.users} u ON u.id = a.user_id WHERE a.provider = ${placeholder(dialect, 1)} AND a.provider_account_id = ${placeholder(dialect, 2)} LIMIT 1`;
|
|
139
|
+
const rows = await executor.select(sql, [provider, providerAccountId]);
|
|
140
|
+
return rows[0] ? rowToUser(rows[0]) : null;
|
|
141
|
+
},
|
|
142
|
+
async updateUser(user) {
|
|
143
|
+
const existing = await this.getUser(user.id);
|
|
144
|
+
if (!existing) {
|
|
145
|
+
throw new Error(`pureq: user ${user.id} not found`);
|
|
146
|
+
}
|
|
147
|
+
const merged = {
|
|
148
|
+
...existing,
|
|
149
|
+
...user,
|
|
150
|
+
};
|
|
151
|
+
const sql = `UPDATE ${tables.users} SET email = ${placeholder(dialect, 1)}, email_verified = ${placeholder(dialect, 2)}, name = ${placeholder(dialect, 3)}, image = ${placeholder(dialect, 4)} WHERE id = ${placeholder(dialect, 5)}`;
|
|
152
|
+
await executor.execute(sql, [merged.email ?? null, merged.emailVerified ?? null, merged.name ?? null, merged.image ?? null, merged.id]);
|
|
153
|
+
return merged;
|
|
154
|
+
},
|
|
155
|
+
async deleteUser(id) {
|
|
156
|
+
await executor.execute(`DELETE FROM ${tables.users} WHERE id = ${placeholder(dialect, 1)}`, [id]);
|
|
157
|
+
},
|
|
158
|
+
async linkAccount(account) {
|
|
159
|
+
const sql = `INSERT INTO ${tables.accounts} (user_id, type, provider, provider_account_id, access_token, refresh_token, expires_at, token_type, scope, id_token) VALUES (${placeholders(dialect, 10)})`;
|
|
160
|
+
await executor.execute(sql, [
|
|
161
|
+
account.userId,
|
|
162
|
+
account.type,
|
|
163
|
+
account.provider,
|
|
164
|
+
account.providerAccountId,
|
|
165
|
+
account.accessToken ?? null,
|
|
166
|
+
account.refreshToken ?? null,
|
|
167
|
+
account.expiresAt ?? null,
|
|
168
|
+
account.tokenType ?? null,
|
|
169
|
+
account.scope ?? null,
|
|
170
|
+
account.idToken ?? null,
|
|
171
|
+
]);
|
|
172
|
+
return account;
|
|
173
|
+
},
|
|
174
|
+
async unlinkAccount(provider, providerAccountId) {
|
|
175
|
+
const sql = `DELETE FROM ${tables.accounts} WHERE provider = ${placeholder(dialect, 1)} AND provider_account_id = ${placeholder(dialect, 2)}`;
|
|
176
|
+
await executor.execute(sql, [provider, providerAccountId]);
|
|
177
|
+
},
|
|
178
|
+
async createSession(session) {
|
|
179
|
+
const sql = `INSERT INTO ${tables.sessions} (session_token, user_id, expires_at) VALUES (${placeholders(dialect, 3)})`;
|
|
180
|
+
await executor.execute(sql, [session.sessionToken, session.userId, session.expiresAt]);
|
|
181
|
+
return session;
|
|
182
|
+
},
|
|
183
|
+
async getSessionAndUser(sessionToken) {
|
|
184
|
+
const sql = `SELECT s.session_token, s.user_id, s.expires_at, u.id, u.email, u.email_verified, u.name, u.image FROM ${tables.sessions} s JOIN ${tables.users} u ON u.id = s.user_id WHERE s.session_token = ${placeholder(dialect, 1)} LIMIT 1`;
|
|
185
|
+
const rows = await executor.select(sql, [sessionToken]);
|
|
186
|
+
const row = rows[0];
|
|
187
|
+
if (!row) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
const session = rowToSession(row);
|
|
191
|
+
if (session.expiresAt < now()) {
|
|
192
|
+
await executor.execute(`DELETE FROM ${tables.sessions} WHERE session_token = ${placeholder(dialect, 1)}`, [sessionToken]);
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
session,
|
|
197
|
+
user: rowToUser(row),
|
|
198
|
+
};
|
|
199
|
+
},
|
|
200
|
+
async updateSession(session) {
|
|
201
|
+
const existing = await executor.select(`SELECT session_token, user_id, expires_at FROM ${tables.sessions} WHERE session_token = ${placeholder(dialect, 1)} LIMIT 1`, [session.sessionToken]);
|
|
202
|
+
if (!existing[0]) {
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
const current = rowToSession(existing[0]);
|
|
206
|
+
const next = {
|
|
207
|
+
sessionToken: current.sessionToken,
|
|
208
|
+
userId: session.userId ?? current.userId,
|
|
209
|
+
expiresAt: session.expiresAt ?? current.expiresAt,
|
|
210
|
+
};
|
|
211
|
+
const sql = `UPDATE ${tables.sessions} SET user_id = ${placeholder(dialect, 1)}, expires_at = ${placeholder(dialect, 2)} WHERE session_token = ${placeholder(dialect, 3)}`;
|
|
212
|
+
await executor.execute(sql, [next.userId, next.expiresAt, next.sessionToken]);
|
|
213
|
+
return next;
|
|
214
|
+
},
|
|
215
|
+
async deleteSession(sessionToken) {
|
|
216
|
+
await executor.execute(`DELETE FROM ${tables.sessions} WHERE session_token = ${placeholder(dialect, 1)}`, [sessionToken]);
|
|
217
|
+
},
|
|
218
|
+
async createVerificationToken(token) {
|
|
219
|
+
const sql = `INSERT INTO ${tables.verificationTokens} (identifier, token, expires_at) VALUES (${placeholders(dialect, 3)})`;
|
|
220
|
+
await executor.execute(sql, [token.identifier, token.token, token.expiresAt]);
|
|
221
|
+
return token;
|
|
222
|
+
},
|
|
223
|
+
async useVerificationToken(params) {
|
|
224
|
+
const selectSql = `SELECT identifier, token, expires_at FROM ${tables.verificationTokens} WHERE identifier = ${placeholder(dialect, 1)} AND token = ${placeholder(dialect, 2)} LIMIT 1`;
|
|
225
|
+
const rows = await executor.select(selectSql, [params.identifier, params.token]);
|
|
226
|
+
const row = rows[0];
|
|
227
|
+
if (!row) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
await executor.execute(`DELETE FROM ${tables.verificationTokens} WHERE identifier = ${placeholder(dialect, 1)} AND token = ${placeholder(dialect, 2)}`, [params.identifier, params.token]);
|
|
231
|
+
const token = {
|
|
232
|
+
identifier: String(row.identifier),
|
|
233
|
+
token: String(row.token),
|
|
234
|
+
expiresAt: toDate(row.expires_at),
|
|
235
|
+
};
|
|
236
|
+
if (token.expiresAt < now()) {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
return token;
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
export function createPostgresAdapter(client, options = {}) {
|
|
244
|
+
return createSqlAdapter("postgres", createPostgresExecutor(client), options);
|
|
245
|
+
}
|
|
246
|
+
export function createMySqlAdapter(client, options = {}) {
|
|
247
|
+
return createSqlAdapter("mysql", createMySqlExecutor(client), options);
|
|
248
|
+
}
|
|
249
|
+
export function getSqlSchemaStatements(dialect, options = {}) {
|
|
250
|
+
const tables = resolveTableNames(options.tableNames);
|
|
251
|
+
if (dialect === "postgres") {
|
|
252
|
+
return [
|
|
253
|
+
`CREATE TABLE IF NOT EXISTS ${tables.users} (id TEXT PRIMARY KEY, email TEXT UNIQUE, email_verified TIMESTAMPTZ NULL, name TEXT NULL, image TEXT NULL);`,
|
|
254
|
+
`CREATE TABLE IF NOT EXISTS ${tables.accounts} (user_id TEXT NOT NULL, type TEXT NOT NULL, provider TEXT NOT NULL, provider_account_id TEXT NOT NULL, access_token TEXT NULL, refresh_token TEXT NULL, expires_at BIGINT NULL, token_type TEXT NULL, scope TEXT NULL, id_token TEXT NULL, PRIMARY KEY (provider, provider_account_id));`,
|
|
255
|
+
`CREATE TABLE IF NOT EXISTS ${tables.sessions} (session_token TEXT PRIMARY KEY, user_id TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL);`,
|
|
256
|
+
`CREATE TABLE IF NOT EXISTS ${tables.verificationTokens} (identifier TEXT NOT NULL, token TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL, PRIMARY KEY (identifier, token));`,
|
|
257
|
+
`CREATE INDEX IF NOT EXISTS ${tables.accounts}_user_id_idx ON ${tables.accounts} (user_id);`,
|
|
258
|
+
`CREATE INDEX IF NOT EXISTS ${tables.sessions}_user_id_idx ON ${tables.sessions} (user_id);`,
|
|
259
|
+
];
|
|
260
|
+
}
|
|
261
|
+
return [
|
|
262
|
+
`CREATE TABLE IF NOT EXISTS ${tables.users} (id VARCHAR(191) PRIMARY KEY, email VARCHAR(320) UNIQUE NULL, email_verified DATETIME NULL, name TEXT NULL, image TEXT NULL);`,
|
|
263
|
+
`CREATE TABLE IF NOT EXISTS ${tables.accounts} (user_id VARCHAR(191) NOT NULL, type VARCHAR(32) NOT NULL, provider VARCHAR(191) NOT NULL, provider_account_id VARCHAR(191) NOT NULL, access_token TEXT NULL, refresh_token TEXT NULL, expires_at BIGINT NULL, token_type VARCHAR(64) NULL, scope TEXT NULL, id_token LONGTEXT NULL, PRIMARY KEY (provider, provider_account_id), INDEX ${tables.accounts}_user_id_idx (user_id));`,
|
|
264
|
+
`CREATE TABLE IF NOT EXISTS ${tables.sessions} (session_token VARCHAR(191) PRIMARY KEY, user_id VARCHAR(191) NOT NULL, expires_at DATETIME NOT NULL, INDEX ${tables.sessions}_user_id_idx (user_id));`,
|
|
265
|
+
`CREATE TABLE IF NOT EXISTS ${tables.verificationTokens} (identifier VARCHAR(320) NOT NULL, token VARCHAR(191) NOT NULL, expires_at DATETIME NOT NULL, PRIMARY KEY (identifier, token));`,
|
|
266
|
+
];
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=sql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/adapter/sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AuthRequestAdapter, AuthRequestAdapterOptions } from "../shared";
|
|
2
|
+
export declare function createAuthRequestAdapter(options?: AuthRequestAdapterOptions): AuthRequestAdapter;
|
|
3
|
+
export type { AuthBridge, AuthPreset, AuthRequestAdapter, AuthRequestAdapterOptions, AuthSessionManager, AuthSessionState, AuthStore } from "../shared";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,kBAAkB,EAClB,yBAAyB,EAI1B,MAAM,WAAW,CAAC;AASnB,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,yBAA8B,GAAG,kBAAkB,CAwCpG;AAED,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createAuthPreset } from "../presets";
|
|
2
|
+
function appendSetCookieHeaders(headers, values) {
|
|
3
|
+
for (const value of values) {
|
|
4
|
+
headers.append("Set-Cookie", value);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export function createAuthRequestAdapter(options = {}) {
|
|
8
|
+
const preset = createAuthPreset(options);
|
|
9
|
+
const defaultRequest = options.request ?? {};
|
|
10
|
+
const readSession = (request = defaultRequest) => {
|
|
11
|
+
return preset.bridge.readSession(request);
|
|
12
|
+
};
|
|
13
|
+
const bootstrap = async (request = defaultRequest) => {
|
|
14
|
+
return preset.bridge.hydrateSessionManager(preset.session, request);
|
|
15
|
+
};
|
|
16
|
+
const buildSetCookieHeaders = (session) => {
|
|
17
|
+
return preset.bridge.buildSetCookieHeaders(session);
|
|
18
|
+
};
|
|
19
|
+
const buildResponseHeaders = (session, headers) => {
|
|
20
|
+
const result = new Headers(headers);
|
|
21
|
+
appendSetCookieHeaders(result, buildSetCookieHeaders(session));
|
|
22
|
+
return result;
|
|
23
|
+
};
|
|
24
|
+
const buildResponseInit = (session, init = {}) => {
|
|
25
|
+
return {
|
|
26
|
+
...init,
|
|
27
|
+
headers: buildResponseHeaders(session, init.headers),
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
return {
|
|
31
|
+
preset,
|
|
32
|
+
storage: preset.storage,
|
|
33
|
+
session: preset.session,
|
|
34
|
+
bridge: preset.bridge,
|
|
35
|
+
readSession,
|
|
36
|
+
bootstrap,
|
|
37
|
+
buildSetCookieHeaders,
|
|
38
|
+
buildResponseHeaders,
|
|
39
|
+
buildResponseInit,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,SAAS,sBAAsB,CAAC,OAAgB,EAAE,MAAyB;IACzE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAAqC,EAAE;IAC9E,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAE7C,MAAM,WAAW,GAAG,CAAC,UAAoD,cAAc,EAAoB,EAAE;QAC3G,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,UAA8D,cAAc,EAA6B,EAAE;QAClI,OAAO,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,OAAyB,EAAqB,EAAE;QAC7E,OAAO,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,CAAC,OAAyB,EAAE,OAAqB,EAAW,EAAE;QACzF,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;QACpC,sBAAsB,CAAC,MAAM,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,OAAyB,EAAE,OAAqB,EAAE,EAAgB,EAAE;QAC7F,OAAO;YACL,GAAG,IAAI;YACP,OAAO,EAAE,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;SACrD,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,MAAM;QACN,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW;QACX,SAAS;QACT,qBAAqB;QACrB,oBAAoB;QACpB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AuthAuthorization, AuthAuthorizationOptions } from "../shared";
|
|
2
|
+
/**
|
|
3
|
+
* FEAT-M1: Create RBAC authorization helpers.
|
|
4
|
+
* Provides role checking and middleware for protecting routes by role.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createAuthorization<TRole extends string = string>(options: AuthAuthorizationOptions<TRole>): AuthAuthorization<TRole>;
|
|
7
|
+
export type { AuthAuthorization, AuthAuthorizationOptions } from "../shared";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAoB,MAAM,WAAW,CAAC;AAI/F;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,MAAM,GAAG,MAAM,EAC/D,OAAO,EAAE,wBAAwB,CAAC,KAAK,CAAC,GACvC,iBAAiB,CAAC,KAAK,CAAC,CA+C1B;AAED,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { markPolicyMiddleware } from "@pureq/pureq";
|
|
2
|
+
import { buildAuthError } from "../shared";
|
|
3
|
+
import { decodeJwt } from "../jwt";
|
|
4
|
+
/**
|
|
5
|
+
* FEAT-M1: Create RBAC authorization helpers.
|
|
6
|
+
* Provides role checking and middleware for protecting routes by role.
|
|
7
|
+
*/
|
|
8
|
+
export function createAuthorization(options) {
|
|
9
|
+
const extractRoles = options.extractRoles;
|
|
10
|
+
return {
|
|
11
|
+
hasRole(session, role) {
|
|
12
|
+
const roles = extractRoles(session);
|
|
13
|
+
return roles.includes(role);
|
|
14
|
+
},
|
|
15
|
+
hasAnyRole(session, roles) {
|
|
16
|
+
const userRoles = extractRoles(session);
|
|
17
|
+
return roles.some((r) => userRoles.includes(r));
|
|
18
|
+
},
|
|
19
|
+
requireRole(role) {
|
|
20
|
+
const middleware = async (req, next) => {
|
|
21
|
+
// Extract session state from Authorization header token
|
|
22
|
+
const authHeader = req.headers?.["Authorization"] ?? req.headers?.["authorization"] ?? "";
|
|
23
|
+
const token = authHeader.replace(/^Bearer\s+/i, "");
|
|
24
|
+
if (!token) {
|
|
25
|
+
throw buildAuthError("PUREQ_AUTH_MISSING_TOKEN", "pureq: no access token for role check");
|
|
26
|
+
}
|
|
27
|
+
let session;
|
|
28
|
+
try {
|
|
29
|
+
const claims = decodeJwt(token);
|
|
30
|
+
session = {
|
|
31
|
+
accessToken: token,
|
|
32
|
+
refreshToken: null,
|
|
33
|
+
...claims,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
session = { accessToken: token, refreshToken: null };
|
|
38
|
+
}
|
|
39
|
+
const roles = extractRoles(session);
|
|
40
|
+
if (!roles.includes(role)) {
|
|
41
|
+
throw buildAuthError("PUREQ_AUTH_FORBIDDEN", `pureq: required role "${role}" not found`);
|
|
42
|
+
}
|
|
43
|
+
return next(req);
|
|
44
|
+
};
|
|
45
|
+
return markPolicyMiddleware(middleware, { name: `requireRole:${role}`, kind: "auth" });
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAwC;IAExC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAE1C,OAAO;QACL,OAAO,CAAC,OAAyB,EAAE,IAAW;YAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAED,UAAU,CAAC,OAAyB,EAAE,KAAuB;YAC3D,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,WAAW,CAAC,IAAW;YACrB,MAAM,UAAU,GAAe,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACjD,wDAAwD;gBACxD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;gBAC1F,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAEpD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,cAAc,CAAC,0BAA0B,EAAE,uCAAuC,CAAC,CAAC;gBAC5F,CAAC;gBAED,IAAI,OAAyB,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,SAAS,CAA0B,KAAK,CAAC,CAAC;oBACzD,OAAO,GAAG;wBACR,WAAW,EAAE,KAAK;wBAClB,YAAY,EAAE,IAAI;wBAClB,GAAG,MAAM;qBACV,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;gBACvD,CAAC;gBAED,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;gBACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,MAAM,cAAc,CAAC,sBAAsB,EAAE,yBAAyB,IAAI,aAAa,CAAC,CAAC;gBAC3F,CAAC;gBAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC,CAAC;YAEF,OAAO,oBAAoB,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,eAAe,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACzF,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { AuthSessionManager, AuthSessionState } from "../shared";
|
|
2
|
+
export interface AuthBridgeRequestLike {
|
|
3
|
+
readonly headers?: Headers | Readonly<Record<string, string | null | undefined>>;
|
|
4
|
+
}
|
|
5
|
+
export interface AuthBridgeCookieOptions {
|
|
6
|
+
readonly accessTokenCookieName?: string;
|
|
7
|
+
readonly refreshTokenCookieName?: string;
|
|
8
|
+
readonly authorizationHeaderName?: string;
|
|
9
|
+
readonly cookiePath?: string;
|
|
10
|
+
readonly sameSite?: "lax" | "strict" | "none";
|
|
11
|
+
readonly secure?: boolean;
|
|
12
|
+
readonly httpOnly?: boolean;
|
|
13
|
+
readonly domain?: string;
|
|
14
|
+
readonly maxAgeSeconds?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface AuthBridge {
|
|
17
|
+
readSession(request: AuthBridgeRequestLike): AuthSessionState;
|
|
18
|
+
buildSetCookieHeaders(session: AuthSessionState): readonly string[];
|
|
19
|
+
hydrateSessionManager(session: AuthSessionManager, request: AuthBridgeRequestLike): Promise<AuthSessionState>;
|
|
20
|
+
}
|
|
21
|
+
/** Create an SSR/BFF bridge for reading sessions from requests and building Set-Cookie response headers. */
|
|
22
|
+
export declare function createAuthBridge(options?: AuthBridgeCookieOptions): AuthBridge;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEtE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;CAClF;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAAC;IAC9D,qBAAqB,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,MAAM,EAAE,CAAC;IACpE,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC/G;AA2GD,4GAA4G;AAC5G,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CAsDlF"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
const MAX_COOKIE_HEADER_LENGTH = 16 * 1024;
|
|
2
|
+
const MAX_COOKIE_SEGMENTS = 256;
|
|
3
|
+
const DEFAULT_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;
|
|
4
|
+
function readHeaderValue(headers, name) {
|
|
5
|
+
if (!headers) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
if (typeof Headers !== "undefined" && headers instanceof Headers) {
|
|
9
|
+
return headers.get(name) ?? headers.get(name.toLowerCase()) ?? headers.get(name.toUpperCase());
|
|
10
|
+
}
|
|
11
|
+
const normalized = name.toLowerCase();
|
|
12
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
13
|
+
if (key.toLowerCase() === normalized) {
|
|
14
|
+
return value ?? null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function parseCookieHeader(cookieHeader) {
|
|
20
|
+
const result = {};
|
|
21
|
+
if (cookieHeader.length > MAX_COOKIE_HEADER_LENGTH) {
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
let segmentCount = 0;
|
|
25
|
+
for (const segment of cookieHeader.split(";")) {
|
|
26
|
+
segmentCount += 1;
|
|
27
|
+
if (segmentCount > MAX_COOKIE_SEGMENTS) {
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
const [rawName, ...rawValueParts] = segment.trim().split("=");
|
|
31
|
+
if (!rawName || rawValueParts.length === 0) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const name = rawName.trim();
|
|
35
|
+
const value = rawValueParts.join("=").trim();
|
|
36
|
+
if (name) {
|
|
37
|
+
try {
|
|
38
|
+
result[decodeURIComponent(name)] = decodeURIComponent(value);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
result[name] = value;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
function parseBearerToken(headerValue) {
|
|
48
|
+
if (!headerValue) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const match = /^Bearer\s+(.+)$/iu.exec(headerValue.trim());
|
|
52
|
+
return match?.[1]?.trim() || null;
|
|
53
|
+
}
|
|
54
|
+
function createCookieHeader(name, value, options) {
|
|
55
|
+
const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value ?? "")}`, `Path=${options.cookiePath}`, `SameSite=${options.sameSite}`];
|
|
56
|
+
if (options.domain) {
|
|
57
|
+
parts.push(`Domain=${options.domain}`);
|
|
58
|
+
}
|
|
59
|
+
if (options.secure) {
|
|
60
|
+
parts.push("Secure");
|
|
61
|
+
}
|
|
62
|
+
// SEC-C4: HttpOnly by default
|
|
63
|
+
if (options.httpOnly) {
|
|
64
|
+
parts.push("HttpOnly");
|
|
65
|
+
}
|
|
66
|
+
if (value === null) {
|
|
67
|
+
parts.push("Max-Age=0");
|
|
68
|
+
}
|
|
69
|
+
else if (options.maxAgeSeconds !== undefined) {
|
|
70
|
+
parts.push(`Max-Age=${options.maxAgeSeconds}`);
|
|
71
|
+
}
|
|
72
|
+
return parts.join("; ");
|
|
73
|
+
}
|
|
74
|
+
/** Create an SSR/BFF bridge for reading sessions from requests and building Set-Cookie response headers. */
|
|
75
|
+
export function createAuthBridge(options = {}) {
|
|
76
|
+
const accessTokenCookieName = options.accessTokenCookieName ?? "pureq_access_token";
|
|
77
|
+
const refreshTokenCookieName = options.refreshTokenCookieName ?? "pureq_refresh_token";
|
|
78
|
+
const authorizationHeaderName = options.authorizationHeaderName ?? "authorization";
|
|
79
|
+
const cookiePath = options.cookiePath ?? "/";
|
|
80
|
+
const sameSite = options.sameSite ?? "lax";
|
|
81
|
+
const secure = options.secure ?? true;
|
|
82
|
+
const httpOnly = options.httpOnly ?? true;
|
|
83
|
+
const readSession = (request) => {
|
|
84
|
+
const cookieHeader = readHeaderValue(request.headers, "cookie");
|
|
85
|
+
const cookies = cookieHeader ? parseCookieHeader(cookieHeader) : {};
|
|
86
|
+
const accessTokenFromCookie = cookies[accessTokenCookieName] ?? null;
|
|
87
|
+
const refreshTokenFromCookie = cookies[refreshTokenCookieName] ?? null;
|
|
88
|
+
const bearerToken = parseBearerToken(readHeaderValue(request.headers, authorizationHeaderName));
|
|
89
|
+
return {
|
|
90
|
+
accessToken: accessTokenFromCookie ?? bearerToken,
|
|
91
|
+
refreshToken: refreshTokenFromCookie,
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
return {
|
|
95
|
+
readSession,
|
|
96
|
+
buildSetCookieHeaders(session) {
|
|
97
|
+
const cookieOptions = {
|
|
98
|
+
cookiePath,
|
|
99
|
+
sameSite,
|
|
100
|
+
secure,
|
|
101
|
+
httpOnly,
|
|
102
|
+
...(options.domain !== undefined ? { domain: options.domain } : {}),
|
|
103
|
+
maxAgeSeconds: options.maxAgeSeconds ?? DEFAULT_MAX_AGE_SECONDS,
|
|
104
|
+
};
|
|
105
|
+
return [
|
|
106
|
+
createCookieHeader(accessTokenCookieName, session.accessToken, cookieOptions),
|
|
107
|
+
createCookieHeader(refreshTokenCookieName, session.refreshToken, cookieOptions),
|
|
108
|
+
];
|
|
109
|
+
},
|
|
110
|
+
async hydrateSessionManager(session, request) {
|
|
111
|
+
const snapshot = readSession(request);
|
|
112
|
+
if (!snapshot.accessToken) {
|
|
113
|
+
await session.clear();
|
|
114
|
+
return snapshot;
|
|
115
|
+
}
|
|
116
|
+
await session.setTokens({
|
|
117
|
+
accessToken: snapshot.accessToken,
|
|
118
|
+
...(snapshot.refreshToken ? { refreshToken: snapshot.refreshToken } : {}),
|
|
119
|
+
});
|
|
120
|
+
return snapshot;
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AuthCallbacks } from "../shared";
|
|
2
|
+
/**
|
|
3
|
+
* FEAT-H5: Compose multiple callback registrations into one.
|
|
4
|
+
* Useful for combining app callbacks with plugin callbacks.
|
|
5
|
+
*/
|
|
6
|
+
export declare function composeAuthCallbacks(...callbackSets: readonly Partial<AuthCallbacks>[]): AuthCallbacks;
|
|
7
|
+
export type { AuthCallbacks } from "../shared";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/callbacks/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,YAAY,EAAE,SAAS,OAAO,CAAC,aAAa,CAAC,EAAE,GAAG,aAAa,CA+CtG;AAED,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FEAT-H5: Compose multiple callback registrations into one.
|
|
3
|
+
* Useful for combining app callbacks with plugin callbacks.
|
|
4
|
+
*/
|
|
5
|
+
export function composeAuthCallbacks(...callbackSets) {
|
|
6
|
+
return {
|
|
7
|
+
async signIn(params) {
|
|
8
|
+
for (const cb of callbackSets) {
|
|
9
|
+
if (cb.signIn) {
|
|
10
|
+
const result = await cb.signIn(params);
|
|
11
|
+
if (result === false) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
},
|
|
18
|
+
async signOut(params) {
|
|
19
|
+
for (const cb of callbackSets) {
|
|
20
|
+
await cb.signOut?.(params);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
async createUser(params) {
|
|
24
|
+
for (const cb of callbackSets) {
|
|
25
|
+
await cb.createUser?.(params);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
async linkAccount(params) {
|
|
29
|
+
for (const cb of callbackSets) {
|
|
30
|
+
await cb.linkAccount?.(params);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
async session(params) {
|
|
34
|
+
let session = params.session;
|
|
35
|
+
for (const cb of callbackSets) {
|
|
36
|
+
if (cb.session) {
|
|
37
|
+
session = await cb.session({ ...params, session });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return session;
|
|
41
|
+
},
|
|
42
|
+
async jwt(params) {
|
|
43
|
+
let token = params.token;
|
|
44
|
+
for (const cb of callbackSets) {
|
|
45
|
+
if (cb.jwt) {
|
|
46
|
+
token = await cb.jwt({ ...params, token });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return token;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.js.map
|