@kaapi/oauth2-auth-design 0.0.13

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.
Files changed (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/lib/flows/auth-code/authorization-route.d.ts +53 -0
  4. package/lib/flows/auth-code/authorization-route.js +202 -0
  5. package/lib/flows/auth-code/authorization-route.js.map +1 -0
  6. package/lib/flows/auth-code/open-id.d.ts +53 -0
  7. package/lib/flows/auth-code/open-id.js +199 -0
  8. package/lib/flows/auth-code/open-id.js.map +1 -0
  9. package/lib/flows/auth-code/token-route.d.ts +35 -0
  10. package/lib/flows/auth-code/token-route.js +61 -0
  11. package/lib/flows/auth-code/token-route.js.map +1 -0
  12. package/lib/flows/auth-code.ts/open-id.d.ts +52 -0
  13. package/lib/flows/auth-code.ts/open-id.js +169 -0
  14. package/lib/flows/auth-code.ts/open-id.js.map +1 -0
  15. package/lib/flows/authentication-code.d.ts +53 -0
  16. package/lib/flows/authentication-code.js +380 -0
  17. package/lib/flows/authentication-code.js.map +1 -0
  18. package/lib/flows/client-credentials.d.ts +55 -0
  19. package/lib/flows/client-credentials.js +318 -0
  20. package/lib/flows/client-credentials.js.map +1 -0
  21. package/lib/flows/common.d.ts +139 -0
  22. package/lib/flows/common.js +235 -0
  23. package/lib/flows/common.js.map +1 -0
  24. package/lib/index.d.ts +13 -0
  25. package/lib/index.js +16 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/utils/cache-set.d.ts +12 -0
  28. package/lib/utils/cache-set.js +35 -0
  29. package/lib/utils/cache-set.js.map +1 -0
  30. package/lib/utils/client-auth-methods.d.ts +77 -0
  31. package/lib/utils/client-auth-methods.js +225 -0
  32. package/lib/utils/client-auth-methods.js.map +1 -0
  33. package/lib/utils/in-memory-cache.d.ts +5 -0
  34. package/lib/utils/in-memory-cache.js +30 -0
  35. package/lib/utils/in-memory-cache.js.map +1 -0
  36. package/lib/utils/in-memory-jwks-store.d.ts +12 -0
  37. package/lib/utils/in-memory-jwks-store.js +46 -0
  38. package/lib/utils/in-memory-jwks-store.js.map +1 -0
  39. package/lib/utils/jwks-generator.d.ts +58 -0
  40. package/lib/utils/jwks-generator.js +141 -0
  41. package/lib/utils/jwks-generator.js.map +1 -0
  42. package/lib/utils/jwks-store.d.ts +13 -0
  43. package/lib/utils/jwks-store.js +3 -0
  44. package/lib/utils/jwks-store.js.map +1 -0
  45. package/lib/utils/token-types.d.ts +46 -0
  46. package/lib/utils/token-types.js +143 -0
  47. package/lib/utils/token-types.js.map +1 -0
  48. package/package.json +44 -0
  49. package/types/overrides.d.ts +14 -0
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryTmpCache = void 0;
4
+ const tslib_1 = require("tslib");
5
+ class InMemoryTmpCache {
6
+ constructor() {
7
+ this.values = {};
8
+ }
9
+ has(value) {
10
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
11
+ if (this.values[`${value}`]) {
12
+ return true;
13
+ }
14
+ return false;
15
+ });
16
+ }
17
+ set(value, ttlSeconds) {
18
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
19
+ const to = this.values[`${value}`];
20
+ if (to) {
21
+ clearTimeout(to);
22
+ }
23
+ this.values[`${value}`] = setTimeout(() => {
24
+ delete this.values[`${value}`];
25
+ }, ttlSeconds * 1000);
26
+ });
27
+ }
28
+ }
29
+ exports.InMemoryTmpCache = InMemoryTmpCache;
30
+ //# sourceMappingURL=in-memory-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-cache.js","sourceRoot":"","sources":["../../src/utils/in-memory-cache.ts"],"names":[],"mappings":";;;;AAEA,MAAa,gBAAgB;IAA7B;QACY,WAAM,GAAmC,EAAE,CAAA;IAkBvD,CAAC;IAhBS,GAAG,CAAC,KAAQ;;YACd,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAA;YACf,CAAC;YACD,OAAO,KAAK,CAAA;QAChB,CAAC;KAAA;IAEK,GAAG,CAAC,KAAQ,EAAE,UAAkB;;YAClC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,CAAA;YAClC,IAAI,EAAE,EAAE,CAAC;gBACL,YAAY,CAAC,EAAE,CAAC,CAAA;YACpB,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,CAAA;YAClC,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,CAAA;QACzB,CAAC;KAAA;CACJ;AAnBD,4CAmBC"}
@@ -0,0 +1,12 @@
1
+ import { JWKSStore, JWKS } from './jwks-store';
2
+ /**
3
+ * InMemoryJWKSStore class
4
+ */
5
+ export declare class InMemoryJWKSStore implements JWKSStore {
6
+ private jwks?;
7
+ private expiresAt?;
8
+ private timeout?;
9
+ get(): Promise<JWKS | undefined>;
10
+ set(jwks: JWKS, ttlSeconds?: number): Promise<void>;
11
+ }
12
+ export declare function getInMemoryJWKSStore(): InMemoryJWKSStore;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryJWKSStore = void 0;
4
+ exports.getInMemoryJWKSStore = getInMemoryJWKSStore;
5
+ const tslib_1 = require("tslib");
6
+ /**
7
+ * InMemoryJWKSStore class
8
+ */
9
+ class InMemoryJWKSStore {
10
+ get() {
11
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
12
+ if (this.expiresAt && Date.now() > this.expiresAt) {
13
+ this.jwks = undefined;
14
+ this.expiresAt = undefined;
15
+ }
16
+ return this.jwks;
17
+ });
18
+ }
19
+ set(jwks, ttlSeconds) {
20
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
21
+ this.jwks = jwks;
22
+ if (this.timeout) {
23
+ clearTimeout(this.timeout);
24
+ }
25
+ if (ttlSeconds) {
26
+ this.expiresAt = Date.now() + ttlSeconds * 1000;
27
+ this.timeout = setTimeout(() => {
28
+ this.jwks = undefined;
29
+ this.expiresAt = undefined;
30
+ }, ttlSeconds * 1000);
31
+ }
32
+ else {
33
+ this.expiresAt = undefined;
34
+ }
35
+ });
36
+ }
37
+ }
38
+ exports.InMemoryJWKSStore = InMemoryJWKSStore;
39
+ let inMemoryJWKSStore;
40
+ function getInMemoryJWKSStore() {
41
+ if (!inMemoryJWKSStore) {
42
+ inMemoryJWKSStore = new InMemoryJWKSStore();
43
+ }
44
+ return inMemoryJWKSStore;
45
+ }
46
+ //# sourceMappingURL=in-memory-jwks-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-jwks-store.js","sourceRoot":"","sources":["../../src/utils/in-memory-jwks-store.ts"],"names":[],"mappings":";;;AAqCA,oDAKC;;AAxCD;;GAEG;AACH,MAAa,iBAAiB;IAKpB,GAAG;;YACL,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChD,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;gBACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;YAC9B,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAA;QACpB,CAAC;KAAA;IAEK,GAAG,CAAC,IAAU,EAAE,UAAmB;;YACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC9B,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACb,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,GAAG,IAAI,CAAA;gBAC/C,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC3B,IAAI,CAAC,IAAI,GAAG,SAAS,CAAA;oBACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;gBAC9B,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;YAC9B,CAAC;QACL,CAAC;KAAA;CACJ;AA5BD,8CA4BC;AAED,IAAI,iBAAoC,CAAC;AAEzC,SAAgB,oBAAoB;IAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrB,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAA;IAC/C,CAAC;IACD,OAAO,iBAAiB,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { JwtPayload } from 'jsonwebtoken';
2
+ import jwktopem from 'jwk-to-pem';
3
+ import { JWKSStore } from './jwks-store';
4
+ export { JwtPayload } from 'jsonwebtoken';
5
+ export interface OAuth2JwtPayload extends JwtPayload {
6
+ /**
7
+ * Identifier of the Identity Provider (IdP), usually a URL
8
+ */
9
+ iss: string;
10
+ /**
11
+ * Identifier for the authenticated user (unique per iss)
12
+ */
13
+ sub: string;
14
+ /**
15
+ * Client ID of the relying party (the app that receives the token)
16
+ */
17
+ aud: string | string[];
18
+ /**
19
+ * Must be present if a nonce was included in the original request (used to prevent replay attacks)
20
+ */
21
+ nonce?: string;
22
+ /**
23
+ * Time when the user actually authenticated. Required if the max_age parameter was used in the auth request
24
+ */
25
+ auth_time?: number;
26
+ }
27
+ export declare function createIDToken(generator: JWKSGenerator, payload: OAuth2JwtPayload): Promise<string>;
28
+ /**
29
+ * JWKSGenerator class
30
+ */
31
+ export declare class JWKSGenerator {
32
+ #private;
33
+ /**
34
+ * ttl in seconds
35
+ */
36
+ get ttl(): number | undefined;
37
+ /**
38
+ * ttl in seconds
39
+ */
40
+ set ttl(ttlSeconds: number | undefined);
41
+ constructor(store: JWKSStore, ttlSeconds?: number);
42
+ private _retrieveKeyStore;
43
+ private _saveKeyStore;
44
+ private _generateIfEmpty;
45
+ generateIfEmpty(): Promise<object>;
46
+ /**
47
+ * Generate a new key pair
48
+ */
49
+ generate(): Promise<void>;
50
+ sign(payload: JwtPayload): Promise<string>;
51
+ /**
52
+ * Get public keys
53
+ */
54
+ get(): Promise<object>;
55
+ getPublicKey(kid: string): Promise<jwktopem.RSA>;
56
+ getPublicKeyAsPem(kid: string): Promise<string>;
57
+ verify(token: string): Promise<string | JwtPayload>;
58
+ }
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var _JWKSGenerator_store, _JWKSGenerator_ttlSeconds;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.JWKSGenerator = void 0;
5
+ exports.createIDToken = createIDToken;
6
+ const tslib_1 = require("tslib");
7
+ const jsonwebtoken_1 = require("jsonwebtoken");
8
+ const node_jose_1 = tslib_1.__importDefault(require("node-jose"));
9
+ const jwk_to_pem_1 = tslib_1.__importDefault(require("jwk-to-pem"));
10
+ function createIDToken(generator, payload) {
11
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
12
+ const ttlSeconds = generator.ttl;
13
+ const now = Math.floor(Date.now() / 1000);
14
+ return yield generator.sign(Object.assign(Object.assign({}, (payload)), { exp: typeof ttlSeconds === 'number' ? now + ttlSeconds : payload === null || payload === void 0 ? void 0 : payload.exp, iat: now }));
15
+ });
16
+ }
17
+ /**
18
+ * JWKSGenerator class
19
+ */
20
+ class JWKSGenerator {
21
+ /**
22
+ * ttl in seconds
23
+ */
24
+ get ttl() {
25
+ return tslib_1.__classPrivateFieldGet(this, _JWKSGenerator_ttlSeconds, "f");
26
+ }
27
+ /**
28
+ * ttl in seconds
29
+ */
30
+ set ttl(ttlSeconds) {
31
+ if (['number', 'undefined'].includes(typeof ttlSeconds))
32
+ tslib_1.__classPrivateFieldSet(this, _JWKSGenerator_ttlSeconds, ttlSeconds, "f");
33
+ }
34
+ constructor(store, ttlSeconds) {
35
+ _JWKSGenerator_store.set(this, void 0);
36
+ _JWKSGenerator_ttlSeconds.set(this, void 0);
37
+ tslib_1.__classPrivateFieldSet(this, _JWKSGenerator_store, store, "f");
38
+ tslib_1.__classPrivateFieldSet(this, _JWKSGenerator_ttlSeconds, ttlSeconds, "f");
39
+ }
40
+ _retrieveKeyStore() {
41
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
42
+ var _a;
43
+ const ks = yield tslib_1.__classPrivateFieldGet(this, _JWKSGenerator_store, "f").get();
44
+ if ((_a = ks === null || ks === void 0 ? void 0 : ks.keys) === null || _a === void 0 ? void 0 : _a.length) {
45
+ return yield node_jose_1.default.JWK.asKeyStore(JSON.stringify(ks));
46
+ }
47
+ else {
48
+ return node_jose_1.default.JWK.createKeyStore();
49
+ }
50
+ });
51
+ }
52
+ _saveKeyStore(keyStore) {
53
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
54
+ const json = keyStore.toJSON(true);
55
+ if (json && 'keys' in json && Array.isArray(json.keys)) {
56
+ yield tslib_1.__classPrivateFieldGet(this, _JWKSGenerator_store, "f").set({ keys: json.keys }, tslib_1.__classPrivateFieldGet(this, _JWKSGenerator_ttlSeconds, "f"));
57
+ }
58
+ });
59
+ }
60
+ _generateIfEmpty() {
61
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
62
+ const keyStore = yield this._retrieveKeyStore();
63
+ const arr = keyStore.all({ use: 'sig' });
64
+ if (!arr.length) {
65
+ yield keyStore.generate('RSA', 2048, { alg: 'RS256', use: 'sig' });
66
+ yield this._saveKeyStore(keyStore);
67
+ }
68
+ return keyStore;
69
+ });
70
+ }
71
+ generateIfEmpty() {
72
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
73
+ const keyStore = yield this._generateIfEmpty();
74
+ const json = keyStore.toJSON();
75
+ if (json && 'keys' in json && Array.isArray(json.keys)) {
76
+ json.keys.reverse();
77
+ }
78
+ return json;
79
+ });
80
+ }
81
+ /**
82
+ * Generate a new key pair
83
+ */
84
+ generate() {
85
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
86
+ const keyStore = yield this._retrieveKeyStore();
87
+ yield keyStore.generate('RSA', 2048, { alg: 'RS256', use: 'sig' });
88
+ yield this._saveKeyStore(keyStore);
89
+ });
90
+ }
91
+ sign(payload) {
92
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
93
+ const keyStore = yield this._generateIfEmpty();
94
+ const key = keyStore.all({ use: 'sig' })
95
+ .pop();
96
+ if (!key)
97
+ throw new Error('sign: KEY STORE IS EMPTY');
98
+ const result = yield node_jose_1.default.JWS.createSign({ compact: true, fields: { typ: 'jwt' } }, key)
99
+ .update(typeof payload === 'string' || payload instanceof Buffer ? payload : JSON.stringify(payload))
100
+ .final();
101
+ return `${result}`;
102
+ });
103
+ }
104
+ /**
105
+ * Get public keys
106
+ */
107
+ get() {
108
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
109
+ const keyStore = yield this._retrieveKeyStore();
110
+ const json = keyStore.toJSON();
111
+ if (json && 'keys' in json && Array.isArray(json.keys)) {
112
+ json.keys.reverse();
113
+ }
114
+ return json;
115
+ });
116
+ }
117
+ getPublicKey(kid) {
118
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
119
+ const keyStore = yield this._retrieveKeyStore();
120
+ return keyStore.get(kid).toJSON();
121
+ });
122
+ }
123
+ getPublicKeyAsPem(kid) {
124
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
125
+ const key = yield this.getPublicKey(kid);
126
+ return (0, jwk_to_pem_1.default)(key);
127
+ });
128
+ }
129
+ verify(token) {
130
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
131
+ var _a;
132
+ const [header] = token.split('.');
133
+ const kid = (_a = JSON.parse(Buffer.from(header, 'base64url').toString())) === null || _a === void 0 ? void 0 : _a.kid;
134
+ const publicKey = yield this.getPublicKeyAsPem(kid);
135
+ return (0, jsonwebtoken_1.verify)(token, publicKey);
136
+ });
137
+ }
138
+ }
139
+ exports.JWKSGenerator = JWKSGenerator;
140
+ _JWKSGenerator_store = new WeakMap(), _JWKSGenerator_ttlSeconds = new WeakMap();
141
+ //# sourceMappingURL=jwks-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwks-generator.js","sourceRoot":"","sources":["../../src/utils/jwks-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * JWKS interface
3
+ */
4
+ export interface JWKS {
5
+ keys: Array<Record<string, unknown>>;
6
+ }
7
+ /**
8
+ * JWKSStore interface
9
+ */
10
+ export interface JWKSStore {
11
+ get(): Promise<JWKS | undefined>;
12
+ set(jwks: JWKS, ttlSeconds?: number): Promise<void>;
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=jwks-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwks-store.js","sourceRoot":"","sources":["../../src/utils/jwks-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { ReqRef, ReqRefDefaults, Request } from '@kaapi/kaapi';
2
+ import { StringCacheSet } from './cache-set';
3
+ export type TokenTypeValidationResponse = {
4
+ isValid?: boolean;
5
+ message?: string;
6
+ };
7
+ export type TokenTypeValidation<Refs extends ReqRef = ReqRefDefaults> = (req: Request<Refs>, token: string, ttl: number) => TokenTypeValidationResponse | Promise<TokenTypeValidationResponse>;
8
+ export type TokenRequestValidation<Refs extends ReqRef = ReqRefDefaults> = (req: Request<Refs>, ttl: number) => TokenTypeValidationResponse | Promise<TokenTypeValidationResponse>;
9
+ export interface TokenType<Refs extends ReqRef = ReqRefDefaults> {
10
+ readonly prefix: string;
11
+ /**
12
+ * 401 if not valid
13
+ */
14
+ isValid: (req: Request<Refs>, token: string) => TokenTypeValidationResponse | Promise<TokenTypeValidationResponse>;
15
+ isValidTokenRequest?: (req: Request<Refs>) => TokenTypeValidationResponse | Promise<TokenTypeValidationResponse>;
16
+ }
17
+ export interface IBearerToken<Refs extends ReqRef = ReqRefDefaults> extends TokenType<Refs> {
18
+ readonly prefix: 'Bearer';
19
+ }
20
+ export interface IDPoPToken<Refs extends ReqRef = ReqRefDefaults> extends TokenType<Refs> {
21
+ readonly prefix: 'DPoP';
22
+ }
23
+ export declare class BearerToken<Refs extends ReqRef = ReqRefDefaults> implements IBearerToken<Refs> {
24
+ #private;
25
+ get prefix(): 'Bearer';
26
+ get configuration(): {};
27
+ constructor();
28
+ validate(handler: TokenTypeValidation<Refs>): this;
29
+ isValid(req: Request<any>, token: string): Promise<TokenTypeValidationResponse>;
30
+ }
31
+ export declare class DPoPToken<Refs extends ReqRef = ReqRefDefaults> implements IDPoPToken<Refs> {
32
+ #private;
33
+ get prefix(): 'DPoP';
34
+ get configuration(): {
35
+ dpop_signing_alg_values_supported: string[];
36
+ require_dpop: boolean;
37
+ };
38
+ constructor();
39
+ private _handleDefault;
40
+ setCacheSet(value: StringCacheSet): this;
41
+ setTTL(value: number): this;
42
+ validateTokenRequest(handler: TokenRequestValidation<Refs>): this;
43
+ validate(handler: TokenTypeValidation<Refs>): this;
44
+ isValidTokenRequest(req: Request<any>): Promise<TokenTypeValidationResponse>;
45
+ isValid(req: Request<any>, token: string): Promise<TokenTypeValidationResponse>;
46
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var _BearerToken_ttl, _BearerToken__handler, _DPoPToken_handler, _DPoPToken_tokenRequestHandler, _DPoPToken_ttl, _DPoPToken_cache;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.DPoPToken = exports.BearerToken = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const jose_1 = require("jose");
7
+ const cache_set_1 = require("./cache-set");
8
+ class BearerToken {
9
+ get prefix() {
10
+ return 'Bearer';
11
+ }
12
+ get configuration() {
13
+ return {};
14
+ }
15
+ constructor() {
16
+ _BearerToken_ttl.set(this, 300);
17
+ _BearerToken__handler.set(this, void 0);
18
+ tslib_1.__classPrivateFieldSet(this, _BearerToken__handler, (_, token) => tslib_1.__awaiter(this, void 0, void 0, function* () {
19
+ if (!token)
20
+ return {};
21
+ return { isValid: true };
22
+ }), "f");
23
+ }
24
+ validate(handler) {
25
+ tslib_1.__classPrivateFieldSet(this, _BearerToken__handler, handler, "f");
26
+ return this;
27
+ }
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ isValid(req, token) {
30
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
31
+ return yield tslib_1.__classPrivateFieldGet(this, _BearerToken__handler, "f").call(this, req, token, tslib_1.__classPrivateFieldGet(this, _BearerToken_ttl, "f"));
32
+ });
33
+ }
34
+ }
35
+ exports.BearerToken = BearerToken;
36
+ _BearerToken_ttl = new WeakMap(), _BearerToken__handler = new WeakMap();
37
+ class DPoPToken {
38
+ get prefix() {
39
+ return 'DPoP';
40
+ }
41
+ get configuration() {
42
+ return {
43
+ dpop_signing_alg_values_supported: ['ES256'],
44
+ require_dpop: true
45
+ };
46
+ }
47
+ constructor() {
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
+ _DPoPToken_handler.set(this, void 0);
50
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
51
+ _DPoPToken_tokenRequestHandler.set(this, void 0);
52
+ _DPoPToken_ttl.set(this, 300);
53
+ _DPoPToken_cache.set(this, new cache_set_1.InMemoryTmpCache());
54
+ tslib_1.__classPrivateFieldSet(this, _DPoPToken_handler, (req, token, ttl) => tslib_1.__awaiter(this, void 0, void 0, function* () {
55
+ if (!token)
56
+ return {};
57
+ return yield this._handleDefault(req, ttl);
58
+ }), "f");
59
+ tslib_1.__classPrivateFieldSet(this, _DPoPToken_tokenRequestHandler, (req, ttl) => tslib_1.__awaiter(this, void 0, void 0, function* () {
60
+ return yield this._handleDefault(req, ttl);
61
+ }), "f");
62
+ }
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ _handleDefault(req, ttl) {
65
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
66
+ const dpopHeader = req.raw.req.headers.dpop;
67
+ if (!dpopHeader || typeof dpopHeader != 'string')
68
+ return { message: 'Missing Demonstration of Proof-of-Possession' };
69
+ try {
70
+ const { payload, protectedHeader } = yield (0, jose_1.jwtVerify)(dpopHeader, (header) => tslib_1.__awaiter(this, void 0, void 0, function* () {
71
+ if (!header.jwk)
72
+ throw new Error('Missing JWK');
73
+ return (0, jose_1.importJWK)(header.jwk, header.alg);
74
+ }), { algorithms: ['ES256'] });
75
+ if (payload.htm !== req.method.toUpperCase())
76
+ throw new Error('HTM mismatch');
77
+ const forwardedProto = req.headers['x-forwarded-proto'];
78
+ const protocol = forwardedProto ? forwardedProto : req.server.info.protocol;
79
+ const fullUrl = protocol
80
+ + '://'
81
+ + req.info.host
82
+ + req.path;
83
+ if (payload.htu !== fullUrl)
84
+ throw new Error('HTU mismatch');
85
+ const now = Math.floor(Date.now() / 1000);
86
+ if (!payload.iat)
87
+ throw new Error('Missing IAT');
88
+ if (Math.abs(now - payload.iat) > ttl)
89
+ throw new Error('Proof expired');
90
+ if (!payload.jti)
91
+ throw new Error('Missing JTI');
92
+ if (yield tslib_1.__classPrivateFieldGet(this, _DPoPToken_cache, "f").has(payload.jti))
93
+ throw new Error('Replay detected');
94
+ yield tslib_1.__classPrivateFieldGet(this, _DPoPToken_cache, "f").add(payload.jti, ttl);
95
+ req.app.oauth2 = req.app.oauth2 || {};
96
+ req.app.oauth2.dpopPayload = payload;
97
+ // Optional: bind proof to access token
98
+ if (protectedHeader.jwk) {
99
+ // const tokenThumbprint = ... extract from token cnf.jkt
100
+ const dpopThumbprint = yield (0, jose_1.calculateJwkThumbprint)(protectedHeader.jwk, 'sha256');
101
+ req.app.oauth2.dpopThumbprint = dpopThumbprint;
102
+ // if (tokenThumbprint !== proofThumbprint) throw new Error('Token binding mismatch');
103
+ }
104
+ return { isValid: true };
105
+ }
106
+ catch (err) {
107
+ console.error('Invalid DPoP proof:', err);
108
+ return { message: `${err}` };
109
+ }
110
+ });
111
+ }
112
+ setCacheSet(value) {
113
+ tslib_1.__classPrivateFieldSet(this, _DPoPToken_cache, value, "f");
114
+ return this;
115
+ }
116
+ setTTL(value) {
117
+ tslib_1.__classPrivateFieldSet(this, _DPoPToken_ttl, value, "f");
118
+ return this;
119
+ }
120
+ validateTokenRequest(handler) {
121
+ tslib_1.__classPrivateFieldSet(this, _DPoPToken_tokenRequestHandler, handler, "f");
122
+ return this;
123
+ }
124
+ validate(handler) {
125
+ tslib_1.__classPrivateFieldSet(this, _DPoPToken_handler, handler, "f");
126
+ return this;
127
+ }
128
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
129
+ isValidTokenRequest(req) {
130
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
131
+ return yield tslib_1.__classPrivateFieldGet(this, _DPoPToken_tokenRequestHandler, "f").call(this, req, tslib_1.__classPrivateFieldGet(this, _DPoPToken_ttl, "f"));
132
+ });
133
+ }
134
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
135
+ isValid(req, token) {
136
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
137
+ return yield tslib_1.__classPrivateFieldGet(this, _DPoPToken_handler, "f").call(this, req, token, tslib_1.__classPrivateFieldGet(this, _DPoPToken_ttl, "f"));
138
+ });
139
+ }
140
+ }
141
+ exports.DPoPToken = DPoPToken;
142
+ _DPoPToken_handler = new WeakMap(), _DPoPToken_tokenRequestHandler = new WeakMap(), _DPoPToken_ttl = new WeakMap(), _DPoPToken_cache = new WeakMap();
143
+ //# sourceMappingURL=token-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-types.js","sourceRoot":"","sources":["../../src/utils/token-types.ts"],"names":[],"mappings":";;;;;AAKA,+BAIc;AACd,2CAA+D;AAuC/D,MAAa,WAAW;IAMpB,IAAI,MAAM;QACN,OAAO,QAAQ,CAAA;IACnB,CAAC;IAED,IAAI,aAAa;QACb,OAAO,EAAE,CAAA;IACb,CAAC;IAED;QAXA,2BAAe,GAAG,EAAA;QAClB,wCAAoC;QAWhC,+BAAA,IAAI,yBAAa,CAAO,CAAC,EAAE,KAAK,EAAE,EAAE;YAChC,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAA;YAErB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC5B,CAAC,CAAA,MAAA,CAAA;IACL,CAAC;IAED,QAAQ,CAAC,OAAkC;QACvC,+BAAA,IAAI,yBAAa,OAAO,MAAA,CAAA;QACxB,OAAO,IAAI,CAAA;IACf,CAAC;IAED,8DAA8D;IACxD,OAAO,CAAC,GAAiB,EAAE,KAAa;;YAC1C,OAAO,MAAM,+BAAA,IAAI,6BAAU,MAAd,IAAI,EAAW,GAAG,EAAE,KAAK,EAAE,+BAAA,IAAI,wBAAK,CAAC,CAAA;QACtD,CAAC;KAAA;CACJ;AA/BD,kCA+BC;;AAED,MAAa,SAAS;IAUlB,IAAI,MAAM;QACN,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,IAAI,aAAa;QACb,OAAO;YACH,iCAAiC,EAAE,CAAC,OAAO,CAAC;YAC5C,YAAY,EAAE,IAAI;SACrB,CAAA;IACL,CAAC;IAED;QAlBA,8DAA8D;QAC9D,qCAAkC;QAClC,8DAA8D;QAC9D,iDAAiD;QACjD,yBAAe,GAAG,EAAA;QAClB,2BAAyB,IAAI,4BAAgB,EAAU,EAAA;QAcnD,+BAAA,IAAI,sBAAY,CAAO,GAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC/D,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAA;YACrB,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC9C,CAAC,CAAA,MAAA,CAAA;QAED,+BAAA,IAAI,kCAAwB,CAAO,GAA4B,EAAE,GAAG,EAAE,EAAE;YACpE,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QAC9C,CAAC,CAAA,MAAA,CAAA;IACL,CAAC;IAED,8DAA8D;IAChD,cAAc,CAAC,GAAiB,EAAE,GAAW;;YACvD,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACxC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,IAAI,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAA;YAEpH,IAAI,CAAC;gBACD,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,IAAA,gBAAS,EAAC,UAAU,EAAE,CAAO,MAAM,EAAE,EAAE;oBAC9E,IAAI,CAAC,MAAM,CAAC,GAAG;wBAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;oBAChD,OAAO,IAAA,gBAAS,EAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7C,CAAC,CAAA,EAAE,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAE9B,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBAE9E,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC5E,MAAM,OAAO,GAAG,QAAQ;sBAClB,KAAK;sBACL,GAAG,CAAC,IAAI,CAAC,IAAI;sBACb,GAAG,CAAC,IAAI,CAAC;gBACf,IAAI,OAAO,CAAC,GAAG,KAAK,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBAE7D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAE1C,IAAI,CAAC,OAAO,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;gBACjD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;gBAExE,IAAI,CAAC,OAAO,CAAC,GAAG;oBAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;gBAEjD,IAAI,MAAM,+BAAA,IAAI,wBAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC3E,MAAM,+BAAA,IAAI,wBAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAExC,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAA;gBACrC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC;gBAErC,uCAAuC;gBACvC,IAAI,eAAe,CAAC,GAAG,EAAE,CAAC;oBACtB,yDAAyD;oBACzD,MAAM,cAAc,GAAG,MAAM,IAAA,6BAAsB,EAAC,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBACnF,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,GAAG,cAAc,CAAA;oBAC9C,sFAAsF;gBAC1F,CAAC;gBAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;YAC5B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;gBACzC,OAAO,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,EAAE,CAAA;YAChC,CAAC;QACT,CAAC;KAAA;IAED,WAAW,CAAC,KAAqB;QAC7B,+BAAA,IAAI,oBAAU,KAAK,MAAA,CAAA;QACnB,OAAO,IAAI,CAAA;IACf,CAAC;IAED,MAAM,CAAC,KAAa;QAChB,+BAAA,IAAI,kBAAQ,KAAK,MAAA,CAAA;QACjB,OAAO,IAAI,CAAA;IACf,CAAC;IAED,oBAAoB,CAAC,OAAqC;QACtD,+BAAA,IAAI,kCAAwB,OAAO,MAAA,CAAA;QACnC,OAAO,IAAI,CAAA;IACf,CAAC;IAED,QAAQ,CAAC,OAAkC;QACvC,+BAAA,IAAI,sBAAY,OAAO,MAAA,CAAA;QACvB,OAAO,IAAI,CAAA;IACf,CAAC;IAED,8DAA8D;IACxD,mBAAmB,CAAC,GAAiB;;YACvC,OAAO,MAAM,+BAAA,IAAI,sCAAqB,MAAzB,IAAI,EAAsB,GAAG,EAAE,+BAAA,IAAI,sBAAK,CAAC,CAAA;QAC1D,CAAC;KAAA;IAED,8DAA8D;IACxD,OAAO,CAAC,GAAiB,EAAE,KAAa;;YAC1C,OAAO,MAAM,+BAAA,IAAI,0BAAS,MAAb,IAAI,EAAU,GAAG,EAAE,KAAK,EAAE,+BAAA,IAAI,sBAAK,CAAC,CAAA;QACrD,CAAC;KAAA;CACJ;AA9GD,8BA8GC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@kaapi/oauth2-auth-design",
3
+ "version": "0.0.13",
4
+ "private": false,
5
+ "description": "OAuth2 auth design for kaapi",
6
+ "main": "lib/index.js",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./lib/index.d.ts",
10
+ "default": "./lib/index.js"
11
+ }
12
+ },
13
+ "author": "demingongo",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/demingongo/kaapi.git",
17
+ "directory": "packages/oauth2-auth-design"
18
+ },
19
+ "license": "MIT",
20
+ "dependencies": {
21
+ "@hapi/boom": "^10.0.1",
22
+ "@hapi/hoek": "^11.0.7",
23
+ "@novice1/api-doc-generator": "^1.0.2",
24
+ "html-entities": "^2.6.0",
25
+ "jose": "^6.0.12",
26
+ "jsonwebtoken": "^9.0.2",
27
+ "jwk-to-pem": "^2.0.7",
28
+ "node-jose": "^2.2.0",
29
+ "tslib": "^2.8.1",
30
+ "@kaapi/kaapi": "^0.0.13"
31
+ },
32
+ "devDependencies": {
33
+ "@types/jsonwebtoken": "^9.0.10",
34
+ "@types/jwk-to-pem": "^2.0.3",
35
+ "@types/node-jose": "^1.1.13",
36
+ "kaukau": "^4.1.6",
37
+ "uuid": "^11.1.0"
38
+ },
39
+ "scripts": {
40
+ "lint": "eslint .",
41
+ "build": "tsc && node ./scripts/buildDT.mjs",
42
+ "test": "kaukau --require ts-node/register --config kaukau-src.mjs"
43
+ }
44
+ }
@@ -0,0 +1,14 @@
1
+ import {
2
+ JWTPayload
3
+ } from 'jose';
4
+
5
+ declare module '@kaapi/kaapi' {
6
+ interface RequestApplicationState {
7
+ oauth2?: {
8
+ dpopPayload?: JWTPayload;
9
+ dpopThumbprint?: string;
10
+ };
11
+ }
12
+ }
13
+
14
+ export {}