@technomoron/api-server-base 1.1.13 → 2.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/api-server-base.cjs +181 -74
- package/dist/cjs/api-server-base.d.ts +66 -29
- package/dist/cjs/auth-api/auth-module.d.ts +96 -0
- package/dist/cjs/auth-api/auth-module.js +1032 -0
- package/dist/cjs/auth-api/compat-auth-storage.d.ts +55 -0
- package/dist/cjs/auth-api/compat-auth-storage.js +116 -0
- package/dist/cjs/auth-api/mem-auth-store.d.ts +66 -0
- package/dist/cjs/auth-api/mem-auth-store.js +135 -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 +75 -0
- package/dist/cjs/auth-api/sql-auth-store.js +166 -0
- package/dist/cjs/auth-api/storage.d.ts +36 -0
- package/dist/cjs/{auth-storage.cjs → auth-api/storage.js} +2 -2
- package/dist/cjs/auth-api/types.d.ts +29 -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 +15 -0
- package/dist/cjs/passkey/base.js +6 -0
- package/dist/cjs/passkey/memory.d.ts +26 -0
- package/dist/cjs/passkey/memory.js +82 -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 +54 -0
- package/dist/cjs/passkey/sequelize.js +211 -0
- package/dist/cjs/passkey/service.d.ts +17 -0
- package/dist/cjs/passkey/service.js +221 -0
- package/dist/cjs/passkey/types.d.ts +75 -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 +66 -29
- package/dist/esm/api-server-base.js +179 -72
- package/dist/esm/auth-api/auth-module.d.ts +96 -0
- package/dist/esm/auth-api/auth-module.js +1030 -0
- package/dist/esm/auth-api/compat-auth-storage.d.ts +55 -0
- package/dist/esm/auth-api/compat-auth-storage.js +112 -0
- package/dist/esm/auth-api/mem-auth-store.d.ts +66 -0
- package/dist/esm/auth-api/mem-auth-store.js +131 -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 +75 -0
- package/dist/esm/auth-api/sql-auth-store.js +162 -0
- package/dist/esm/auth-api/storage.d.ts +36 -0
- package/dist/esm/{auth-storage.js → auth-api/storage.js} +2 -2
- package/dist/esm/auth-api/types.d.ts +29 -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 +15 -0
- package/dist/esm/passkey/base.js +2 -0
- package/dist/esm/passkey/memory.d.ts +26 -0
- package/dist/esm/passkey/memory.js +78 -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 +54 -0
- package/dist/esm/passkey/sequelize.js +207 -0
- package/dist/esm/passkey/service.d.ts +17 -0
- package/dist/esm/passkey/service.js +217 -0
- package/dist/esm/passkey/types.d.ts +75 -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 +11 -3
- package/dist/cjs/auth-storage.d.ts +0 -133
- package/dist/esm/auth-storage.d.ts +0 -133
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AuthIdentifier, AuthStorage } from './types.js';
|
|
2
|
+
import type { AuthCodeData, AuthCodeRequest, OAuthClient } from '../oauth/types.js';
|
|
3
|
+
import type { PasskeyChallenge, PasskeyChallengeParams, PasskeyVerificationParams, PasskeyVerificationResult } from '../passkey/types.js';
|
|
4
|
+
import type { Token } from '../token/types.js';
|
|
5
|
+
export declare class BaseAuthStorage<UserRow = unknown, SafeUser = unknown> implements AuthStorage<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
|
+
getClient(clientId: string): Promise<OAuthClient | null>;
|
|
28
|
+
verifyClientSecret(client: OAuthClient, clientSecret: string | null): Promise<boolean>;
|
|
29
|
+
createAuthCode(request: AuthCodeRequest): Promise<AuthCodeData>;
|
|
30
|
+
consumeAuthCode(code: string, clientId: string): Promise<AuthCodeData | null>;
|
|
31
|
+
canImpersonate(params: {
|
|
32
|
+
realUserId: AuthIdentifier;
|
|
33
|
+
effectiveUserId: AuthIdentifier;
|
|
34
|
+
}): Promise<boolean>;
|
|
35
|
+
}
|
|
36
|
+
export declare const nullAuthStorage: AuthStorage<unknown, unknown>;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// Numeric database id or lookup string such as username/email.
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
3
|
exports.nullAuthStorage = exports.BaseAuthStorage = void 0;
|
|
5
4
|
// Handy base you can extend when wiring a real storage adapter. Every method
|
|
@@ -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
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AuthCodeData, AuthCodeRequest, OAuthClient } from '../oauth/types.js';
|
|
2
|
+
import type { PasskeyChallenge, PasskeyChallengeParams, PasskeyVerificationParams, PasskeyVerificationResult } from '../passkey/types.js';
|
|
3
|
+
import type { Token } from '../token/types.js';
|
|
4
|
+
export type AuthIdentifier = string | number;
|
|
5
|
+
export interface AuthStorage<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<Token>, opts?: {
|
|
13
|
+
includeExpired?: boolean;
|
|
14
|
+
}): Promise<Token | null>;
|
|
15
|
+
deleteToken(query: Partial<Token>): Promise<number>;
|
|
16
|
+
updateToken?(updates: Partial<Token> & {
|
|
17
|
+
refreshToken: string;
|
|
18
|
+
}): Promise<boolean>;
|
|
19
|
+
createPasskeyChallenge?(params: PasskeyChallengeParams): Promise<PasskeyChallenge>;
|
|
20
|
+
verifyPasskeyResponse?(params: PasskeyVerificationParams): Promise<PasskeyVerificationResult>;
|
|
21
|
+
getClient?(clientId: string): Promise<OAuthClient | null>;
|
|
22
|
+
verifyClientSecret?(client: OAuthClient, clientSecret: string | null): Promise<boolean>;
|
|
23
|
+
createAuthCode?(request: AuthCodeRequest): Promise<AuthCodeData>;
|
|
24
|
+
consumeAuthCode?(code: string, clientId: string): Promise<AuthCodeData | null>;
|
|
25
|
+
canImpersonate?(params: {
|
|
26
|
+
realUserId: AuthIdentifier;
|
|
27
|
+
effectiveUserId: AuthIdentifier;
|
|
28
|
+
}): Promise<boolean>;
|
|
29
|
+
}
|
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.BaseAuthStorage = exports.nullAuthStorage = exports.ApiModule = exports.ApiError = exports.ApiServer = void 0;
|
|
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.AuthStorageAdapter = exports.BaseAuthModule = exports.nullAuthModule = exports.BaseAuthStorage = exports.nullAuthStorage = 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, "nullAuthStorage", { enumerable: true, get: function () { return
|
|
15
|
-
Object.defineProperty(exports, "BaseAuthStorage", { enumerable: true, get: function () { return
|
|
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, "nullAuthStorage", { enumerable: true, get: function () { return storage_js_1.nullAuthStorage; } });
|
|
15
|
+
Object.defineProperty(exports, "BaseAuthStorage", { enumerable: true, get: function () { return storage_js_1.BaseAuthStorage; } });
|
|
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, "AuthStorageAdapter", { enumerable: true, get: function () { return compat_auth_storage_js_1.AuthStorageAdapter; } });
|
|
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 } from './api-server-base.js';
|
|
5
|
+
export type { AuthIdentifier, AuthStorage } 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 { nullAuthStorage, BaseAuthStorage } from './auth-api/storage.js';
|
|
11
|
+
export { nullAuthModule, BaseAuthModule } from './auth-api/module.js';
|
|
12
|
+
export { AuthStorageAdapter } 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
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Model, type Optional, type Sequelize } from 'sequelize';
|
|
2
|
+
import { OAuthStore, type AuthCode, type OAuthClient } from './base.js';
|
|
3
|
+
export interface OAuthClientAttributes {
|
|
4
|
+
client_id: string;
|
|
5
|
+
client_secret: string;
|
|
6
|
+
name: string | null;
|
|
7
|
+
redirect_uris: string;
|
|
8
|
+
scope: string;
|
|
9
|
+
metadata: string | null;
|
|
10
|
+
first_party: boolean;
|
|
11
|
+
}
|
|
12
|
+
export type OAuthClientCreationAttributes = Optional<OAuthClientAttributes, 'client_secret' | 'name' | 'scope' | 'metadata' | 'first_party'>;
|
|
13
|
+
export declare class OAuthClientModel extends Model<OAuthClientAttributes, OAuthClientCreationAttributes> implements OAuthClientAttributes {
|
|
14
|
+
client_id: string;
|
|
15
|
+
client_secret: string;
|
|
16
|
+
name: string | null;
|
|
17
|
+
redirect_uris: string;
|
|
18
|
+
scope: string;
|
|
19
|
+
metadata: string | null;
|
|
20
|
+
first_party: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function initOAuthClientModel(sequelize: Sequelize): typeof OAuthClientModel;
|
|
23
|
+
export interface OAuthCodeAttributes {
|
|
24
|
+
code: string;
|
|
25
|
+
client_id: string;
|
|
26
|
+
user_id: number;
|
|
27
|
+
redirect_uri: string;
|
|
28
|
+
scope: string;
|
|
29
|
+
code_challenge: string | null;
|
|
30
|
+
code_challenge_method: 'plain' | 'S256' | null;
|
|
31
|
+
expires: Date;
|
|
32
|
+
metadata: string | null;
|
|
33
|
+
}
|
|
34
|
+
export type OAuthCodeCreationAttributes = Optional<OAuthCodeAttributes, 'code_challenge' | 'code_challenge_method' | 'metadata'>;
|
|
35
|
+
export declare class OAuthCodeModel extends Model<OAuthCodeAttributes, OAuthCodeCreationAttributes> implements OAuthCodeAttributes {
|
|
36
|
+
code: string;
|
|
37
|
+
client_id: string;
|
|
38
|
+
user_id: number;
|
|
39
|
+
redirect_uri: string;
|
|
40
|
+
scope: string;
|
|
41
|
+
code_challenge: string | null;
|
|
42
|
+
code_challenge_method: 'plain' | 'S256' | null;
|
|
43
|
+
expires: Date;
|
|
44
|
+
metadata: string | null;
|
|
45
|
+
}
|
|
46
|
+
export declare function initOAuthCodeModel(sequelize: Sequelize): typeof OAuthCodeModel;
|
|
47
|
+
export interface SequelizeOAuthStoreOptions {
|
|
48
|
+
sequelize: Sequelize;
|
|
49
|
+
clientModel?: typeof OAuthClientModel;
|
|
50
|
+
codeModel?: typeof OAuthCodeModel;
|
|
51
|
+
clientModelFactory?: (sequelize: Sequelize) => typeof OAuthClientModel;
|
|
52
|
+
codeModelFactory?: (sequelize: Sequelize) => typeof OAuthCodeModel;
|
|
53
|
+
bcryptRounds?: number;
|
|
54
|
+
}
|
|
55
|
+
export declare class SequelizeOAuthStore extends OAuthStore {
|
|
56
|
+
private readonly clients;
|
|
57
|
+
private readonly codes;
|
|
58
|
+
private readonly bcryptRounds;
|
|
59
|
+
constructor(options: SequelizeOAuthStoreOptions);
|
|
60
|
+
getClient(clientId: string): Promise<OAuthClient | null>;
|
|
61
|
+
createClient(input: OAuthClient): Promise<OAuthClient>;
|
|
62
|
+
verifyClientSecret(clientId: string, clientSecret: string | null): Promise<boolean>;
|
|
63
|
+
createAuthCode(code: AuthCode): Promise<void>;
|
|
64
|
+
consumeAuthCode(code: string): Promise<AuthCode | null>;
|
|
65
|
+
close(): Promise<void>;
|
|
66
|
+
private toOAuthClient;
|
|
67
|
+
private toAuthCode;
|
|
68
|
+
}
|