@technomoron/api-server-base 1.1.13 → 2.0.0-beta.10
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.txt +25 -2
- package/dist/cjs/api-server-base.cjs +448 -111
- package/dist/cjs/api-server-base.d.ts +91 -34
- package/dist/cjs/auth-api/auth-module.d.ts +105 -0
- package/dist/cjs/auth-api/auth-module.js +1180 -0
- package/dist/cjs/auth-api/compat-auth-storage.d.ts +57 -0
- package/dist/cjs/auth-api/compat-auth-storage.js +128 -0
- package/dist/cjs/auth-api/mem-auth-store.d.ts +68 -0
- package/dist/cjs/auth-api/mem-auth-store.js +141 -0
- package/dist/cjs/{auth-module.d.ts → auth-api/module.d.ts} +7 -7
- package/dist/cjs/{auth-module.cjs → auth-api/module.js} +1 -1
- package/dist/cjs/auth-api/sql-auth-store.d.ts +77 -0
- package/dist/cjs/auth-api/sql-auth-store.js +172 -0
- package/dist/cjs/auth-api/storage.d.ts +38 -0
- package/dist/cjs/{auth-storage.cjs → auth-api/storage.js} +17 -7
- package/dist/cjs/auth-api/types.d.ts +34 -0
- package/dist/cjs/auth-api/types.js +2 -0
- package/dist/cjs/index.cjs +41 -7
- package/dist/cjs/index.d.ts +29 -5
- package/dist/cjs/oauth/base.d.ts +10 -0
- package/dist/cjs/oauth/base.js +6 -0
- package/dist/cjs/oauth/memory.d.ts +16 -0
- package/dist/cjs/oauth/memory.js +99 -0
- package/dist/cjs/oauth/models.d.ts +45 -0
- package/dist/cjs/oauth/models.js +58 -0
- package/dist/cjs/oauth/sequelize.d.ts +68 -0
- package/dist/cjs/oauth/sequelize.js +210 -0
- package/dist/cjs/oauth/types.d.ts +50 -0
- package/dist/cjs/oauth/types.js +3 -0
- package/dist/cjs/passkey/base.d.ts +16 -0
- package/dist/cjs/passkey/base.js +6 -0
- package/dist/cjs/passkey/memory.d.ts +27 -0
- package/dist/cjs/passkey/memory.js +86 -0
- package/dist/cjs/passkey/models.d.ts +25 -0
- package/dist/cjs/passkey/models.js +115 -0
- package/dist/cjs/passkey/sequelize.d.ts +55 -0
- package/dist/cjs/passkey/sequelize.js +220 -0
- package/dist/cjs/passkey/service.d.ts +20 -0
- package/dist/cjs/passkey/service.js +356 -0
- package/dist/cjs/passkey/types.d.ts +78 -0
- package/dist/cjs/passkey/types.js +2 -0
- package/dist/cjs/token/base.d.ts +38 -0
- package/dist/cjs/token/base.js +114 -0
- package/dist/cjs/token/memory.d.ts +19 -0
- package/dist/cjs/token/memory.js +149 -0
- package/dist/cjs/token/sequelize.d.ts +58 -0
- package/dist/cjs/token/sequelize.js +404 -0
- package/dist/cjs/token/types.d.ts +27 -0
- package/dist/cjs/token/types.js +2 -0
- package/dist/cjs/user/base.d.ts +26 -0
- package/dist/cjs/user/base.js +45 -0
- package/dist/cjs/user/memory.d.ts +35 -0
- package/dist/cjs/user/memory.js +173 -0
- package/dist/cjs/user/sequelize.d.ts +41 -0
- package/dist/cjs/user/sequelize.js +182 -0
- package/dist/cjs/user/types.d.ts +11 -0
- package/dist/cjs/user/types.js +2 -0
- package/dist/esm/api-server-base.d.ts +91 -34
- package/dist/esm/api-server-base.js +447 -110
- package/dist/esm/auth-api/auth-module.d.ts +105 -0
- package/dist/esm/auth-api/auth-module.js +1178 -0
- package/dist/esm/auth-api/compat-auth-storage.d.ts +57 -0
- package/dist/esm/auth-api/compat-auth-storage.js +124 -0
- package/dist/esm/auth-api/mem-auth-store.d.ts +68 -0
- package/dist/esm/auth-api/mem-auth-store.js +137 -0
- package/dist/esm/{auth-module.d.ts → auth-api/module.d.ts} +7 -7
- package/dist/esm/{auth-module.js → auth-api/module.js} +1 -1
- package/dist/esm/auth-api/sql-auth-store.d.ts +77 -0
- package/dist/esm/auth-api/sql-auth-store.js +168 -0
- package/dist/esm/auth-api/storage.d.ts +38 -0
- package/dist/esm/{auth-storage.js → auth-api/storage.js} +15 -5
- package/dist/esm/auth-api/types.d.ts +34 -0
- package/dist/esm/auth-api/types.js +1 -0
- package/dist/esm/index.d.ts +29 -5
- package/dist/esm/index.js +19 -2
- package/dist/esm/oauth/base.d.ts +10 -0
- package/dist/esm/oauth/base.js +2 -0
- package/dist/esm/oauth/memory.d.ts +16 -0
- package/dist/esm/oauth/memory.js +92 -0
- package/dist/esm/oauth/models.d.ts +45 -0
- package/dist/esm/oauth/models.js +51 -0
- package/dist/esm/oauth/sequelize.d.ts +68 -0
- package/dist/esm/oauth/sequelize.js +199 -0
- package/dist/esm/oauth/types.d.ts +50 -0
- package/dist/esm/oauth/types.js +2 -0
- package/dist/esm/passkey/base.d.ts +16 -0
- package/dist/esm/passkey/base.js +2 -0
- package/dist/esm/passkey/memory.d.ts +27 -0
- package/dist/esm/passkey/memory.js +82 -0
- package/dist/esm/passkey/models.d.ts +25 -0
- package/dist/esm/passkey/models.js +108 -0
- package/dist/esm/passkey/sequelize.d.ts +55 -0
- package/dist/esm/passkey/sequelize.js +216 -0
- package/dist/esm/passkey/service.d.ts +20 -0
- package/dist/esm/passkey/service.js +319 -0
- package/dist/esm/passkey/types.d.ts +78 -0
- package/dist/esm/passkey/types.js +1 -0
- package/dist/esm/token/base.d.ts +38 -0
- package/dist/esm/token/base.js +107 -0
- package/dist/esm/token/memory.d.ts +19 -0
- package/dist/esm/token/memory.js +145 -0
- package/dist/esm/token/sequelize.d.ts +58 -0
- package/dist/esm/token/sequelize.js +400 -0
- package/dist/esm/token/types.d.ts +27 -0
- package/dist/esm/token/types.js +1 -0
- package/dist/esm/user/base.d.ts +26 -0
- package/dist/esm/user/base.js +38 -0
- package/dist/esm/user/memory.d.ts +35 -0
- package/dist/esm/user/memory.js +169 -0
- package/dist/esm/user/sequelize.d.ts +41 -0
- package/dist/esm/user/sequelize.js +176 -0
- package/dist/esm/user/types.d.ts +11 -0
- package/dist/esm/user/types.js +1 -0
- package/package.json +13 -3
- package/dist/cjs/auth-storage.d.ts +0 -133
- package/dist/esm/auth-storage.d.ts +0 -133
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqlAuthStore = void 0;
|
|
4
|
+
const sequelize_js_1 = require("../oauth/sequelize.js");
|
|
5
|
+
const sequelize_js_2 = require("../passkey/sequelize.js");
|
|
6
|
+
const sequelize_js_3 = require("../token/sequelize.js");
|
|
7
|
+
const sequelize_js_4 = require("../user/sequelize.js");
|
|
8
|
+
const compat_auth_storage_js_1 = require("./compat-auth-storage.js");
|
|
9
|
+
const DEFAULT_PASSKEY_CONFIG = {
|
|
10
|
+
rpId: 'localhost',
|
|
11
|
+
rpName: 'API Server',
|
|
12
|
+
origins: ['http://localhost:5173'],
|
|
13
|
+
timeoutMs: 5 * 60 * 1000,
|
|
14
|
+
userVerification: 'preferred'
|
|
15
|
+
};
|
|
16
|
+
function isOriginString(origin) {
|
|
17
|
+
return typeof origin === 'string' && origin.trim().length > 0;
|
|
18
|
+
}
|
|
19
|
+
function normalizePasskeyConfig(config = {}) {
|
|
20
|
+
const candidateOrigins = Array.isArray(config.origins) && config.origins.length > 0 ? config.origins.filter(isOriginString) : null;
|
|
21
|
+
return {
|
|
22
|
+
rpId: config.rpId?.trim() || DEFAULT_PASSKEY_CONFIG.rpId,
|
|
23
|
+
rpName: config.rpName?.trim() || DEFAULT_PASSKEY_CONFIG.rpName,
|
|
24
|
+
origins: candidateOrigins ? candidateOrigins.map((origin) => origin.trim()) : DEFAULT_PASSKEY_CONFIG.origins,
|
|
25
|
+
timeoutMs: typeof config.timeoutMs === 'number' && config.timeoutMs > 0
|
|
26
|
+
? config.timeoutMs
|
|
27
|
+
: DEFAULT_PASSKEY_CONFIG.timeoutMs,
|
|
28
|
+
userVerification: config.userVerification ?? DEFAULT_PASSKEY_CONFIG.userVerification
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
class SqlAuthStore {
|
|
32
|
+
constructor(params) {
|
|
33
|
+
this.closed = false;
|
|
34
|
+
if (!params?.sequelize) {
|
|
35
|
+
throw new Error('SqlAuthStore requires an initialised Sequelize instance');
|
|
36
|
+
}
|
|
37
|
+
this.sequelize = params.sequelize;
|
|
38
|
+
this.syncOptions = params.syncOptions;
|
|
39
|
+
this.userStore = new sequelize_js_4.SequelizeUserStore({
|
|
40
|
+
sequelize: this.sequelize,
|
|
41
|
+
userModel: params.userModel,
|
|
42
|
+
userModelFactory: params.userModelFactory,
|
|
43
|
+
recordMapper: params.userRecordMapper,
|
|
44
|
+
toPublic: params.publicUserMapper,
|
|
45
|
+
bcryptRounds: params.bcryptRounds,
|
|
46
|
+
bcryptPepper: params.passwordPepper
|
|
47
|
+
});
|
|
48
|
+
this.tokenStore =
|
|
49
|
+
params.tokenStore ?? new sequelize_js_3.SequelizeTokenStore({ sequelize: this.sequelize, ...params.tokenStoreOptions });
|
|
50
|
+
this.oauthStore = new sequelize_js_1.SequelizeOAuthStore({
|
|
51
|
+
sequelize: this.sequelize,
|
|
52
|
+
...params.oauthStoreOptions,
|
|
53
|
+
bcryptRounds: params.bcryptRounds
|
|
54
|
+
});
|
|
55
|
+
let passkeyStore;
|
|
56
|
+
let passkeyConfig;
|
|
57
|
+
if (params.passkeys !== false) {
|
|
58
|
+
passkeyConfig = normalizePasskeyConfig(params.passkeys ?? {});
|
|
59
|
+
const resolveUser = async (lookup) => {
|
|
60
|
+
const found = await this.userStore.findUser(lookup.userId ?? lookup.login ?? '');
|
|
61
|
+
if (!found) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const mapper = params.passkeyUserMapper ??
|
|
65
|
+
((user) => ({
|
|
66
|
+
id: (this.userStore.getUserId(user) ?? user['user_id']),
|
|
67
|
+
login: user.login ?? String(this.userStore.getUserId(user)),
|
|
68
|
+
displayName: user.login ?? String(this.userStore.getUserId(user))
|
|
69
|
+
}));
|
|
70
|
+
return mapper(found);
|
|
71
|
+
};
|
|
72
|
+
passkeyStore = new sequelize_js_2.SequelizePasskeyStore({ sequelize: this.sequelize, resolveUser });
|
|
73
|
+
this.passkeyStore = passkeyStore;
|
|
74
|
+
}
|
|
75
|
+
this.adapter = new compat_auth_storage_js_1.CompositeAuthAdapter({
|
|
76
|
+
userStore: this.userStore,
|
|
77
|
+
tokenStore: this.tokenStore,
|
|
78
|
+
passkeys: passkeyStore && passkeyConfig ? { store: passkeyStore, config: passkeyConfig } : undefined,
|
|
79
|
+
oauthStore: this.oauthStore,
|
|
80
|
+
canImpersonate: params.canImpersonate
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
async initialise(withSync = false) {
|
|
84
|
+
await this.sequelize.authenticate();
|
|
85
|
+
if (withSync) {
|
|
86
|
+
await this.sequelize.sync(this.syncOptions);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async close() {
|
|
90
|
+
if (this.closed) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.closed = true;
|
|
94
|
+
try {
|
|
95
|
+
await this.sequelize.close();
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const message = error?.message ?? '';
|
|
99
|
+
if (!/closed/i.test(message)) {
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
this.sequelize.close = async () => { };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async getUser(identifier) {
|
|
108
|
+
return this.adapter.getUser(identifier);
|
|
109
|
+
}
|
|
110
|
+
getUserPasswordHash(user) {
|
|
111
|
+
return this.adapter.getUserPasswordHash(user);
|
|
112
|
+
}
|
|
113
|
+
getUserId(user) {
|
|
114
|
+
return this.adapter.getUserId(user);
|
|
115
|
+
}
|
|
116
|
+
filterUser(user) {
|
|
117
|
+
return this.adapter.filterUser(user);
|
|
118
|
+
}
|
|
119
|
+
async verifyPassword(password, hash) {
|
|
120
|
+
return this.adapter.verifyPassword(password, hash);
|
|
121
|
+
}
|
|
122
|
+
async storeToken(data) {
|
|
123
|
+
return this.adapter.storeToken(data);
|
|
124
|
+
}
|
|
125
|
+
async getToken(query, opts) {
|
|
126
|
+
const normalized = {
|
|
127
|
+
...query,
|
|
128
|
+
userId: query.userId !== undefined && query.userId !== null ? String(query.userId) : undefined,
|
|
129
|
+
ruid: query.ruid !== undefined && query.ruid !== null ? String(query.ruid) : undefined
|
|
130
|
+
};
|
|
131
|
+
return this.adapter.getToken(normalized, opts);
|
|
132
|
+
}
|
|
133
|
+
async deleteToken(query) {
|
|
134
|
+
const normalized = {
|
|
135
|
+
...query,
|
|
136
|
+
userId: query.userId !== undefined && query.userId !== null ? String(query.userId) : undefined,
|
|
137
|
+
ruid: query.ruid !== undefined && query.ruid !== null ? String(query.ruid) : undefined
|
|
138
|
+
};
|
|
139
|
+
return this.adapter.deleteToken(normalized);
|
|
140
|
+
}
|
|
141
|
+
async updateToken(updates) {
|
|
142
|
+
return this.adapter.updateToken(updates);
|
|
143
|
+
}
|
|
144
|
+
async createPasskeyChallenge(params) {
|
|
145
|
+
return this.adapter.createPasskeyChallenge(params);
|
|
146
|
+
}
|
|
147
|
+
async verifyPasskeyResponse(params) {
|
|
148
|
+
return this.adapter.verifyPasskeyResponse(params);
|
|
149
|
+
}
|
|
150
|
+
async listUserCredentials(userId) {
|
|
151
|
+
return this.adapter.listUserCredentials(userId);
|
|
152
|
+
}
|
|
153
|
+
async deletePasskeyCredential(credentialId) {
|
|
154
|
+
return this.adapter.deletePasskeyCredential(credentialId);
|
|
155
|
+
}
|
|
156
|
+
async getClient(clientId) {
|
|
157
|
+
return this.adapter.getClient(clientId);
|
|
158
|
+
}
|
|
159
|
+
async verifyClientSecret(client, clientSecret) {
|
|
160
|
+
return this.adapter.verifyClientSecret(client, clientSecret);
|
|
161
|
+
}
|
|
162
|
+
async createAuthCode(request) {
|
|
163
|
+
return this.adapter.createAuthCode(request);
|
|
164
|
+
}
|
|
165
|
+
async consumeAuthCode(code, clientId) {
|
|
166
|
+
return this.adapter.consumeAuthCode(code, clientId);
|
|
167
|
+
}
|
|
168
|
+
async canImpersonate(params) {
|
|
169
|
+
return this.adapter.canImpersonate(params);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.SqlAuthStore = SqlAuthStore;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AuthAdapter, AuthIdentifier } from './types.js';
|
|
2
|
+
import type { AuthCodeData, AuthCodeRequest, OAuthClient } from '../oauth/types.js';
|
|
3
|
+
import type { PasskeyChallenge, PasskeyChallengeParams, PasskeyVerificationParams, PasskeyVerificationResult, StoredPasskeyCredential } from '../passkey/types.js';
|
|
4
|
+
import type { Token } from '../token/types.js';
|
|
5
|
+
export declare class BaseAuthAdapter<UserRow = unknown, SafeUser = unknown> implements AuthAdapter<UserRow, SafeUser> {
|
|
6
|
+
getUser(identifier: AuthIdentifier): Promise<UserRow | null>;
|
|
7
|
+
getUserPasswordHash(user: UserRow): string;
|
|
8
|
+
getUserId(user: UserRow): AuthIdentifier;
|
|
9
|
+
filterUser(user: UserRow): SafeUser;
|
|
10
|
+
verifyPassword(password: string, hash: string): Promise<boolean>;
|
|
11
|
+
storeToken(data: Token): Promise<void>;
|
|
12
|
+
getToken(query: Partial<Omit<Token, 'userId' | 'ruid'>> & {
|
|
13
|
+
userId?: string | number;
|
|
14
|
+
ruid?: string | number;
|
|
15
|
+
}, opts?: {
|
|
16
|
+
includeExpired?: boolean;
|
|
17
|
+
}): Promise<Token | null>;
|
|
18
|
+
deleteToken(query: Partial<Omit<Token, 'userId' | 'ruid'>> & {
|
|
19
|
+
userId?: string | number;
|
|
20
|
+
ruid?: string | number;
|
|
21
|
+
}): Promise<number>;
|
|
22
|
+
updateToken(updates: Partial<Token> & {
|
|
23
|
+
refreshToken: string;
|
|
24
|
+
}): Promise<boolean>;
|
|
25
|
+
createPasskeyChallenge(params: PasskeyChallengeParams): Promise<PasskeyChallenge>;
|
|
26
|
+
verifyPasskeyResponse(params: PasskeyVerificationParams): Promise<PasskeyVerificationResult>;
|
|
27
|
+
listUserCredentials(userId: AuthIdentifier): Promise<StoredPasskeyCredential[]>;
|
|
28
|
+
deletePasskeyCredential(credentialId: Buffer | string): Promise<boolean>;
|
|
29
|
+
getClient(clientId: string): Promise<OAuthClient | null>;
|
|
30
|
+
verifyClientSecret(client: OAuthClient, clientSecret: string | null): Promise<boolean>;
|
|
31
|
+
createAuthCode(request: AuthCodeRequest): Promise<AuthCodeData>;
|
|
32
|
+
consumeAuthCode(code: string, clientId: string): Promise<AuthCodeData | null>;
|
|
33
|
+
canImpersonate(params: {
|
|
34
|
+
realUserId: AuthIdentifier;
|
|
35
|
+
effectiveUserId: AuthIdentifier;
|
|
36
|
+
}): Promise<boolean>;
|
|
37
|
+
}
|
|
38
|
+
export declare const nullAuthAdapter: AuthAdapter<unknown, unknown>;
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Numeric database id or lookup string such as username/email.
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
5
|
-
// Handy base you can extend when wiring a real
|
|
3
|
+
exports.nullAuthAdapter = exports.BaseAuthAdapter = void 0;
|
|
4
|
+
// Handy base you can extend when wiring a real auth adapter. Every method
|
|
6
5
|
// throws by default so unimplemented hooks fail loudly.
|
|
7
|
-
class
|
|
6
|
+
class BaseAuthAdapter {
|
|
8
7
|
// Override to load a user record by identifier
|
|
9
8
|
async getUser(identifier) {
|
|
10
9
|
void identifier;
|
|
@@ -36,8 +35,9 @@ class BaseAuthStorage {
|
|
|
36
35
|
throw new Error('Auth storage not configured');
|
|
37
36
|
}
|
|
38
37
|
// Override to look up a stored token by query
|
|
39
|
-
async getToken(query) {
|
|
38
|
+
async getToken(query, opts) {
|
|
40
39
|
void query;
|
|
40
|
+
void opts;
|
|
41
41
|
return null;
|
|
42
42
|
}
|
|
43
43
|
// Override to remove stored tokens that match the query
|
|
@@ -60,6 +60,16 @@ class BaseAuthStorage {
|
|
|
60
60
|
void params;
|
|
61
61
|
throw new Error('Auth storage not configured');
|
|
62
62
|
}
|
|
63
|
+
// Override to list passkey credentials for a user
|
|
64
|
+
async listUserCredentials(userId) {
|
|
65
|
+
void userId;
|
|
66
|
+
throw new Error('Auth storage not configured');
|
|
67
|
+
}
|
|
68
|
+
// Override to delete a passkey credential
|
|
69
|
+
async deletePasskeyCredential(credentialId) {
|
|
70
|
+
void credentialId;
|
|
71
|
+
throw new Error('Auth storage not configured');
|
|
72
|
+
}
|
|
63
73
|
// Override to fetch an OAuth client by identifier
|
|
64
74
|
async getClient(clientId) {
|
|
65
75
|
void clientId;
|
|
@@ -88,5 +98,5 @@ class BaseAuthStorage {
|
|
|
88
98
|
return false;
|
|
89
99
|
}
|
|
90
100
|
}
|
|
91
|
-
exports.
|
|
92
|
-
exports.
|
|
101
|
+
exports.BaseAuthAdapter = BaseAuthAdapter;
|
|
102
|
+
exports.nullAuthAdapter = new BaseAuthAdapter();
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AuthCodeData, AuthCodeRequest, OAuthClient } from '../oauth/types.js';
|
|
2
|
+
import type { PasskeyChallenge, PasskeyChallengeParams, PasskeyVerificationParams, PasskeyVerificationResult, StoredPasskeyCredential } from '../passkey/types.js';
|
|
3
|
+
import type { Token } from '../token/types.js';
|
|
4
|
+
export type AuthIdentifier = string | number;
|
|
5
|
+
/** @internal */
|
|
6
|
+
export interface AuthAdapter<UserRow, SafeUser> {
|
|
7
|
+
getUser(identifier: AuthIdentifier): Promise<UserRow | null>;
|
|
8
|
+
getUserPasswordHash(user: UserRow): string;
|
|
9
|
+
getUserId(user: UserRow): AuthIdentifier;
|
|
10
|
+
filterUser(user: UserRow): SafeUser;
|
|
11
|
+
verifyPassword(password: string, hash: string): Promise<boolean>;
|
|
12
|
+
storeToken(data: Token): Promise<void>;
|
|
13
|
+
getToken(query: Partial<Token>, opts?: {
|
|
14
|
+
includeExpired?: boolean;
|
|
15
|
+
}): Promise<Token | null>;
|
|
16
|
+
deleteToken(query: Partial<Token>): Promise<number>;
|
|
17
|
+
updateToken?(updates: Partial<Token> & {
|
|
18
|
+
refreshToken: string;
|
|
19
|
+
}): Promise<boolean>;
|
|
20
|
+
createPasskeyChallenge?(params: PasskeyChallengeParams): Promise<PasskeyChallenge>;
|
|
21
|
+
verifyPasskeyResponse?(params: PasskeyVerificationParams): Promise<PasskeyVerificationResult>;
|
|
22
|
+
listUserCredentials?(userId: AuthIdentifier): Promise<StoredPasskeyCredential[]>;
|
|
23
|
+
deletePasskeyCredential?(credentialId: Buffer | string): Promise<boolean>;
|
|
24
|
+
getClient?(clientId: string): Promise<OAuthClient | null>;
|
|
25
|
+
verifyClientSecret?(client: OAuthClient, clientSecret: string | null): Promise<boolean>;
|
|
26
|
+
createAuthCode?(request: AuthCodeRequest): Promise<AuthCodeData>;
|
|
27
|
+
consumeAuthCode?(code: string, clientId: string): Promise<AuthCodeData | null>;
|
|
28
|
+
canImpersonate?(params: {
|
|
29
|
+
realUserId: AuthIdentifier;
|
|
30
|
+
effectiveUserId: AuthIdentifier;
|
|
31
|
+
}): Promise<boolean>;
|
|
32
|
+
}
|
|
33
|
+
/** @internal */
|
|
34
|
+
export type AuthStorage<UserRow, SafeUser> = AuthAdapter<UserRow, SafeUser>;
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -3,16 +3,50 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.BaseAuthModule = exports.nullAuthModule = exports.
|
|
6
|
+
exports.SequelizeOAuthStore = exports.MemoryOAuthStore = exports.OAuthStore = exports.SequelizePasskeyStore = exports.MemoryPasskeyStore = exports.PasskeyStore = exports.PasskeyService = exports.SequelizeTokenStore = exports.MemoryTokenStore = exports.TokenStore = exports.SequelizeUserStore = exports.MemoryUserStore = exports.UserStore = exports.AuthModule = exports.SqlAuthStore = exports.MemAuthStore = exports.CompositeAuthAdapter = exports.BaseAuthModule = exports.nullAuthModule = exports.BaseAuthAdapter = exports.nullAuthAdapter = exports.ApiModule = exports.ApiError = exports.ApiServer = void 0;
|
|
7
7
|
var api_server_base_js_1 = require("./api-server-base.cjs");
|
|
8
8
|
Object.defineProperty(exports, "ApiServer", { enumerable: true, get: function () { return __importDefault(api_server_base_js_1).default; } });
|
|
9
9
|
var api_server_base_js_2 = require("./api-server-base.cjs");
|
|
10
10
|
Object.defineProperty(exports, "ApiError", { enumerable: true, get: function () { return api_server_base_js_2.ApiError; } });
|
|
11
11
|
var api_module_js_1 = require("./api-module.cjs");
|
|
12
12
|
Object.defineProperty(exports, "ApiModule", { enumerable: true, get: function () { return api_module_js_1.ApiModule; } });
|
|
13
|
-
var
|
|
14
|
-
Object.defineProperty(exports, "
|
|
15
|
-
Object.defineProperty(exports, "
|
|
16
|
-
var
|
|
17
|
-
Object.defineProperty(exports, "nullAuthModule", { enumerable: true, get: function () { return
|
|
18
|
-
Object.defineProperty(exports, "BaseAuthModule", { enumerable: true, get: function () { return
|
|
13
|
+
var storage_js_1 = require("./auth-api/storage.js");
|
|
14
|
+
Object.defineProperty(exports, "nullAuthAdapter", { enumerable: true, get: function () { return storage_js_1.nullAuthAdapter; } });
|
|
15
|
+
Object.defineProperty(exports, "BaseAuthAdapter", { enumerable: true, get: function () { return storage_js_1.BaseAuthAdapter; } });
|
|
16
|
+
var module_js_1 = require("./auth-api/module.js");
|
|
17
|
+
Object.defineProperty(exports, "nullAuthModule", { enumerable: true, get: function () { return module_js_1.nullAuthModule; } });
|
|
18
|
+
Object.defineProperty(exports, "BaseAuthModule", { enumerable: true, get: function () { return module_js_1.BaseAuthModule; } });
|
|
19
|
+
var compat_auth_storage_js_1 = require("./auth-api/compat-auth-storage.js");
|
|
20
|
+
Object.defineProperty(exports, "CompositeAuthAdapter", { enumerable: true, get: function () { return compat_auth_storage_js_1.CompositeAuthAdapter; } });
|
|
21
|
+
var mem_auth_store_js_1 = require("./auth-api/mem-auth-store.js");
|
|
22
|
+
Object.defineProperty(exports, "MemAuthStore", { enumerable: true, get: function () { return mem_auth_store_js_1.MemAuthStore; } });
|
|
23
|
+
var sql_auth_store_js_1 = require("./auth-api/sql-auth-store.js");
|
|
24
|
+
Object.defineProperty(exports, "SqlAuthStore", { enumerable: true, get: function () { return sql_auth_store_js_1.SqlAuthStore; } });
|
|
25
|
+
var auth_module_js_1 = require("./auth-api/auth-module.js");
|
|
26
|
+
Object.defineProperty(exports, "AuthModule", { enumerable: true, get: function () { return __importDefault(auth_module_js_1).default; } });
|
|
27
|
+
var base_js_1 = require("./user/base.js");
|
|
28
|
+
Object.defineProperty(exports, "UserStore", { enumerable: true, get: function () { return base_js_1.UserStore; } });
|
|
29
|
+
var memory_js_1 = require("./user/memory.js");
|
|
30
|
+
Object.defineProperty(exports, "MemoryUserStore", { enumerable: true, get: function () { return memory_js_1.MemoryUserStore; } });
|
|
31
|
+
var sequelize_js_1 = require("./user/sequelize.js");
|
|
32
|
+
Object.defineProperty(exports, "SequelizeUserStore", { enumerable: true, get: function () { return sequelize_js_1.SequelizeUserStore; } });
|
|
33
|
+
var base_js_2 = require("./token/base.js");
|
|
34
|
+
Object.defineProperty(exports, "TokenStore", { enumerable: true, get: function () { return base_js_2.TokenStore; } });
|
|
35
|
+
var memory_js_2 = require("./token/memory.js");
|
|
36
|
+
Object.defineProperty(exports, "MemoryTokenStore", { enumerable: true, get: function () { return memory_js_2.MemoryTokenStore; } });
|
|
37
|
+
var sequelize_js_2 = require("./token/sequelize.js");
|
|
38
|
+
Object.defineProperty(exports, "SequelizeTokenStore", { enumerable: true, get: function () { return sequelize_js_2.SequelizeTokenStore; } });
|
|
39
|
+
var service_js_1 = require("./passkey/service.js");
|
|
40
|
+
Object.defineProperty(exports, "PasskeyService", { enumerable: true, get: function () { return service_js_1.PasskeyService; } });
|
|
41
|
+
var base_js_3 = require("./passkey/base.js");
|
|
42
|
+
Object.defineProperty(exports, "PasskeyStore", { enumerable: true, get: function () { return base_js_3.PasskeyStore; } });
|
|
43
|
+
var memory_js_3 = require("./passkey/memory.js");
|
|
44
|
+
Object.defineProperty(exports, "MemoryPasskeyStore", { enumerable: true, get: function () { return memory_js_3.MemoryPasskeyStore; } });
|
|
45
|
+
var sequelize_js_3 = require("./passkey/sequelize.js");
|
|
46
|
+
Object.defineProperty(exports, "SequelizePasskeyStore", { enumerable: true, get: function () { return sequelize_js_3.SequelizePasskeyStore; } });
|
|
47
|
+
var base_js_4 = require("./oauth/base.js");
|
|
48
|
+
Object.defineProperty(exports, "OAuthStore", { enumerable: true, get: function () { return base_js_4.OAuthStore; } });
|
|
49
|
+
var memory_js_4 = require("./oauth/memory.js");
|
|
50
|
+
Object.defineProperty(exports, "MemoryOAuthStore", { enumerable: true, get: function () { return memory_js_4.MemoryOAuthStore; } });
|
|
51
|
+
var sequelize_js_4 = require("./oauth/sequelize.js");
|
|
52
|
+
Object.defineProperty(exports, "SequelizeOAuthStore", { enumerable: true, get: function () { return sequelize_js_4.SequelizeOAuthStore; } });
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -1,8 +1,32 @@
|
|
|
1
1
|
export { default as ApiServer } from './api-server-base.js';
|
|
2
2
|
export { ApiError } from './api-server-base.js';
|
|
3
3
|
export { ApiModule } from './api-module.js';
|
|
4
|
-
export type { ApiErrorParams, ApiHandler, ApiKey, ApiServerConf, ApiRequest, ApiRoute, ApiAuthType, ApiAuthClass, ApiTokenData,
|
|
5
|
-
export type { AuthIdentifier
|
|
6
|
-
export type {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
4
|
+
export type { ApiErrorParams, ApiHandler, ApiKey, ApiServerConf, ApiRequest, ApiRoute, ApiAuthType, ApiAuthClass, ApiTokenData, ExtendedReq, ExpressApiRequest, ExpressApiLocals } from './api-server-base.js';
|
|
5
|
+
export type { AuthIdentifier } from './auth-api/types.js';
|
|
6
|
+
export type { Token, TokenPair, TokenStatus } from './token/types.js';
|
|
7
|
+
export type { JwtSignResult, JwtVerifyResult, JwtDecodeResult } from './token/base.js';
|
|
8
|
+
export type { OAuthClient, AuthCodeData, AuthCodeRequest } from './oauth/types.js';
|
|
9
|
+
export type { AuthProviderModule } from './auth-api/module.js';
|
|
10
|
+
export { nullAuthAdapter, BaseAuthAdapter } from './auth-api/storage.js';
|
|
11
|
+
export { nullAuthModule, BaseAuthModule } from './auth-api/module.js';
|
|
12
|
+
export { CompositeAuthAdapter } from './auth-api/compat-auth-storage.js';
|
|
13
|
+
export { MemAuthStore } from './auth-api/mem-auth-store.js';
|
|
14
|
+
export { SqlAuthStore } from './auth-api/sql-auth-store.js';
|
|
15
|
+
export { default as AuthModule } from './auth-api/auth-module.js';
|
|
16
|
+
export type { OAuthStartParams, OAuthStartResult, OAuthCallbackParams, OAuthCallbackResult } from './oauth/types.js';
|
|
17
|
+
export type { BcryptHasherOptions, CreateUserInput, UpdateUserInput, PublicUserMapper } from './user/types.js';
|
|
18
|
+
export { UserStore } from './user/base.js';
|
|
19
|
+
export { MemoryUserStore } from './user/memory.js';
|
|
20
|
+
export { SequelizeUserStore } from './user/sequelize.js';
|
|
21
|
+
export type { MemoryUserAttributes, MemoryUserStoreOptions } from './user/memory.js';
|
|
22
|
+
export { TokenStore } from './token/base.js';
|
|
23
|
+
export { MemoryTokenStore } from './token/memory.js';
|
|
24
|
+
export { SequelizeTokenStore } from './token/sequelize.js';
|
|
25
|
+
export { PasskeyService } from './passkey/service.js';
|
|
26
|
+
export { PasskeyStore } from './passkey/base.js';
|
|
27
|
+
export { MemoryPasskeyStore } from './passkey/memory.js';
|
|
28
|
+
export { SequelizePasskeyStore } from './passkey/sequelize.js';
|
|
29
|
+
export type { PasskeyServiceConfig, PasskeyChallengeRecord, PasskeyUserDescriptor, StoredPasskeyCredential, PasskeyChallenge, PasskeyChallengeParams, PasskeyVerificationParams, PasskeyVerificationResult } from './passkey/types.js';
|
|
30
|
+
export { OAuthStore } from './oauth/base.js';
|
|
31
|
+
export { MemoryOAuthStore } from './oauth/memory.js';
|
|
32
|
+
export { SequelizeOAuthStore } from './oauth/sequelize.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AuthCode, OAuthClient } from './types.js';
|
|
2
|
+
export declare abstract class OAuthStore {
|
|
3
|
+
abstract getClient(clientId: string): Promise<OAuthClient | null>;
|
|
4
|
+
abstract createClient(input: OAuthClient): Promise<OAuthClient>;
|
|
5
|
+
abstract verifyClientSecret(clientId: string, secret: string | null): Promise<boolean>;
|
|
6
|
+
abstract createAuthCode(code: AuthCode): Promise<void>;
|
|
7
|
+
abstract consumeAuthCode(code: string): Promise<AuthCode | null>;
|
|
8
|
+
abstract close(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export type { OAuthClient, AuthCode } from './types.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { OAuthStore, type AuthCode, type OAuthClient } from './base.js';
|
|
2
|
+
export interface MemoryOAuthStoreOptions {
|
|
3
|
+
bcryptRounds?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class MemoryOAuthStore extends OAuthStore {
|
|
6
|
+
private readonly clients;
|
|
7
|
+
private readonly codes;
|
|
8
|
+
private readonly bcryptRounds;
|
|
9
|
+
constructor(options?: MemoryOAuthStoreOptions);
|
|
10
|
+
getClient(clientId: string): Promise<OAuthClient | null>;
|
|
11
|
+
createClient(input: OAuthClient): Promise<OAuthClient>;
|
|
12
|
+
verifyClientSecret(clientId: string, secret: string | null): Promise<boolean>;
|
|
13
|
+
createAuthCode(code: AuthCode): Promise<void>;
|
|
14
|
+
consumeAuthCode(code: string): Promise<AuthCode | null>;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MemoryOAuthStore = void 0;
|
|
7
|
+
const bcryptjs_1 = __importDefault(require("bcryptjs"));
|
|
8
|
+
const base_js_1 = require("./base.js");
|
|
9
|
+
function cloneClient(client) {
|
|
10
|
+
if (!client) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
clientId: client.clientId,
|
|
15
|
+
clientSecret: client.clientSecret,
|
|
16
|
+
name: client.name,
|
|
17
|
+
redirectUris: [...client.redirectUris],
|
|
18
|
+
scope: client.scope ? [...client.scope] : undefined,
|
|
19
|
+
metadata: client.metadata ? { ...client.metadata } : undefined,
|
|
20
|
+
firstParty: client.firstParty
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function cloneCode(code) {
|
|
24
|
+
return {
|
|
25
|
+
...code,
|
|
26
|
+
scope: code.scope ? [...code.scope] : undefined,
|
|
27
|
+
expiresAt: new Date(code.expiresAt),
|
|
28
|
+
metadata: code.metadata ? { ...code.metadata } : undefined
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function normalizeUserId(identifier) {
|
|
32
|
+
if (typeof identifier === 'number' && Number.isFinite(identifier)) {
|
|
33
|
+
return identifier;
|
|
34
|
+
}
|
|
35
|
+
if (typeof identifier === 'string' && /^\d+$/.test(identifier)) {
|
|
36
|
+
return Number(identifier);
|
|
37
|
+
}
|
|
38
|
+
throw new Error(`Unable to normalise user identifier: ${identifier}`);
|
|
39
|
+
}
|
|
40
|
+
class MemoryOAuthStore extends base_js_1.OAuthStore {
|
|
41
|
+
constructor(options = {}) {
|
|
42
|
+
super();
|
|
43
|
+
this.clients = new Map();
|
|
44
|
+
this.codes = new Map();
|
|
45
|
+
this.bcryptRounds = options.bcryptRounds ?? 12;
|
|
46
|
+
}
|
|
47
|
+
async getClient(clientId) {
|
|
48
|
+
return cloneClient(this.clients.get(clientId));
|
|
49
|
+
}
|
|
50
|
+
async createClient(input) {
|
|
51
|
+
const clientSecret = input.clientSecret ? await bcryptjs_1.default.hash(input.clientSecret, this.bcryptRounds) : '';
|
|
52
|
+
const stored = {
|
|
53
|
+
clientId: input.clientId,
|
|
54
|
+
clientSecret,
|
|
55
|
+
name: input.name,
|
|
56
|
+
redirectUris: [...input.redirectUris],
|
|
57
|
+
scope: input.scope ? [...input.scope] : undefined,
|
|
58
|
+
metadata: input.metadata ? { ...input.metadata } : undefined,
|
|
59
|
+
firstParty: input.firstParty
|
|
60
|
+
};
|
|
61
|
+
this.clients.set(stored.clientId, stored);
|
|
62
|
+
return cloneClient(stored);
|
|
63
|
+
}
|
|
64
|
+
async verifyClientSecret(clientId, secret) {
|
|
65
|
+
const client = this.clients.get(clientId);
|
|
66
|
+
if (!client) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (!client.clientSecret) {
|
|
70
|
+
return !secret || secret.length === 0;
|
|
71
|
+
}
|
|
72
|
+
if (!secret) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return bcryptjs_1.default.compare(secret, client.clientSecret);
|
|
76
|
+
}
|
|
77
|
+
async createAuthCode(code) {
|
|
78
|
+
const record = {
|
|
79
|
+
...code,
|
|
80
|
+
userId: normalizeUserId(code.userId),
|
|
81
|
+
scope: code.scope ? [...code.scope] : undefined,
|
|
82
|
+
expiresAt: code.expiresAt,
|
|
83
|
+
metadata: code.metadata ? { ...code.metadata } : undefined
|
|
84
|
+
};
|
|
85
|
+
this.codes.set(record.code, record);
|
|
86
|
+
}
|
|
87
|
+
async consumeAuthCode(code) {
|
|
88
|
+
const record = this.codes.get(code);
|
|
89
|
+
if (!record) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
this.codes.delete(code);
|
|
93
|
+
return cloneCode(record);
|
|
94
|
+
}
|
|
95
|
+
async close() {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.MemoryOAuthStore = MemoryOAuthStore;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Model, type Optional, type Sequelize } from 'sequelize';
|
|
2
|
+
export interface OAuthClientAttributes {
|
|
3
|
+
client_id: string;
|
|
4
|
+
client_secret: string;
|
|
5
|
+
name: string | null;
|
|
6
|
+
redirect_uris: string;
|
|
7
|
+
scope: string;
|
|
8
|
+
metadata: string | null;
|
|
9
|
+
first_party: boolean;
|
|
10
|
+
}
|
|
11
|
+
export type OAuthClientCreationAttributes = Optional<OAuthClientAttributes, 'client_secret' | 'name' | 'scope' | 'metadata' | 'first_party'>;
|
|
12
|
+
export declare class OAuthClientModel extends Model<OAuthClientAttributes, OAuthClientCreationAttributes> implements OAuthClientAttributes {
|
|
13
|
+
client_id: string;
|
|
14
|
+
client_secret: string;
|
|
15
|
+
name: string | null;
|
|
16
|
+
redirect_uris: string;
|
|
17
|
+
scope: string;
|
|
18
|
+
metadata: string | null;
|
|
19
|
+
first_party: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function initOAuthClientModel(sequelize: Sequelize): typeof OAuthClientModel;
|
|
22
|
+
export interface OAuthCodeAttributes {
|
|
23
|
+
code: string;
|
|
24
|
+
client_id: string;
|
|
25
|
+
user_id: number;
|
|
26
|
+
redirect_uri: string;
|
|
27
|
+
scope: string;
|
|
28
|
+
code_challenge: string | null;
|
|
29
|
+
code_challenge_method: 'plain' | 'S256' | null;
|
|
30
|
+
expires: Date;
|
|
31
|
+
metadata: string | null;
|
|
32
|
+
}
|
|
33
|
+
export type OAuthCodeCreationAttributes = Optional<OAuthCodeAttributes, 'code_challenge' | 'code_challenge_method' | 'metadata'>;
|
|
34
|
+
export declare class OAuthCodeModel extends Model<OAuthCodeAttributes, OAuthCodeCreationAttributes> implements OAuthCodeAttributes {
|
|
35
|
+
code: string;
|
|
36
|
+
client_id: string;
|
|
37
|
+
user_id: number;
|
|
38
|
+
redirect_uri: string;
|
|
39
|
+
scope: string;
|
|
40
|
+
code_challenge: string | null;
|
|
41
|
+
code_challenge_method: 'plain' | 'S256' | null;
|
|
42
|
+
expires: Date;
|
|
43
|
+
metadata: string | null;
|
|
44
|
+
}
|
|
45
|
+
export declare function initOAuthCodeModel(sequelize: Sequelize): typeof OAuthCodeModel;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OAuthCodeModel = exports.OAuthClientModel = void 0;
|
|
4
|
+
exports.initOAuthClientModel = initOAuthClientModel;
|
|
5
|
+
exports.initOAuthCodeModel = initOAuthCodeModel;
|
|
6
|
+
const sequelize_1 = require("sequelize");
|
|
7
|
+
const DIALECTS_SUPPORTING_UNSIGNED = new Set(['mysql', 'mariadb']);
|
|
8
|
+
function integerIdType(sequelize) {
|
|
9
|
+
return DIALECTS_SUPPORTING_UNSIGNED.has(sequelize.getDialect()) ? sequelize_1.DataTypes.INTEGER.UNSIGNED : sequelize_1.DataTypes.INTEGER;
|
|
10
|
+
}
|
|
11
|
+
function tableOptions(sequelize, tableName, extra) {
|
|
12
|
+
const opts = { sequelize, tableName };
|
|
13
|
+
if (extra) {
|
|
14
|
+
Object.assign(opts, extra);
|
|
15
|
+
}
|
|
16
|
+
if (DIALECTS_SUPPORTING_UNSIGNED.has(sequelize.getDialect())) {
|
|
17
|
+
opts.charset = 'utf8mb4';
|
|
18
|
+
opts.collate = 'utf8mb4_unicode_ci';
|
|
19
|
+
}
|
|
20
|
+
return opts;
|
|
21
|
+
}
|
|
22
|
+
class OAuthClientModel extends sequelize_1.Model {
|
|
23
|
+
}
|
|
24
|
+
exports.OAuthClientModel = OAuthClientModel;
|
|
25
|
+
function initOAuthClientModel(sequelize) {
|
|
26
|
+
OAuthClientModel.init({
|
|
27
|
+
client_id: { type: sequelize_1.DataTypes.STRING(128), allowNull: false, primaryKey: true },
|
|
28
|
+
client_secret: { type: sequelize_1.DataTypes.STRING(255), allowNull: false, defaultValue: '' },
|
|
29
|
+
name: { type: sequelize_1.DataTypes.STRING(128), allowNull: true, defaultValue: null },
|
|
30
|
+
redirect_uris: { type: sequelize_1.DataTypes.TEXT, allowNull: false, defaultValue: '[]' },
|
|
31
|
+
scope: { type: sequelize_1.DataTypes.TEXT, allowNull: false, defaultValue: '[]' },
|
|
32
|
+
metadata: { type: sequelize_1.DataTypes.TEXT, allowNull: true, defaultValue: null },
|
|
33
|
+
first_party: { type: sequelize_1.DataTypes.BOOLEAN, allowNull: false, defaultValue: false }
|
|
34
|
+
}, {
|
|
35
|
+
...tableOptions(sequelize, 'oauth_clients', { timestamps: false })
|
|
36
|
+
});
|
|
37
|
+
return OAuthClientModel;
|
|
38
|
+
}
|
|
39
|
+
class OAuthCodeModel extends sequelize_1.Model {
|
|
40
|
+
}
|
|
41
|
+
exports.OAuthCodeModel = OAuthCodeModel;
|
|
42
|
+
function initOAuthCodeModel(sequelize) {
|
|
43
|
+
const idType = integerIdType(sequelize);
|
|
44
|
+
OAuthCodeModel.init({
|
|
45
|
+
code: { type: sequelize_1.DataTypes.STRING(128), allowNull: false, primaryKey: true },
|
|
46
|
+
client_id: { type: sequelize_1.DataTypes.STRING(128), allowNull: false },
|
|
47
|
+
user_id: { type: idType, allowNull: false },
|
|
48
|
+
redirect_uri: { type: sequelize_1.DataTypes.TEXT, allowNull: false },
|
|
49
|
+
scope: { type: sequelize_1.DataTypes.TEXT, allowNull: false, defaultValue: '[]' },
|
|
50
|
+
code_challenge: { type: sequelize_1.DataTypes.STRING(255), allowNull: true, defaultValue: null },
|
|
51
|
+
code_challenge_method: { type: sequelize_1.DataTypes.STRING(10), allowNull: true, defaultValue: null },
|
|
52
|
+
expires: { type: sequelize_1.DataTypes.DATE, allowNull: false },
|
|
53
|
+
metadata: { type: sequelize_1.DataTypes.TEXT, allowNull: true, defaultValue: null }
|
|
54
|
+
}, {
|
|
55
|
+
...tableOptions(sequelize, 'oauth_codes', { timestamps: false })
|
|
56
|
+
});
|
|
57
|
+
return OAuthCodeModel;
|
|
58
|
+
}
|