@tsed/oidc-provider 6.123.0 → 6.123.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"OidcAccountsMethods.js","sourceRoot":"","sources":["../../../src/domain/OidcAccountsMethods.ts"],"names":[],"mappings":"","sourcesContent":["import {PlatformContext} from \"@tsed/common\";\nimport {Provider, Account} from \"oidc-provider\";\n\nexport type AuthorizationCode = InstanceType<Provider[\"AuthorizationCode\"]>;\nexport type AccessToken = InstanceType<Provider[\"AccessToken\"]>;\nexport type DeviceCode = InstanceType<Provider[\"DeviceCode\"]>;\nexport type BackchannelAuthenticationRequest = InstanceType<Provider[\"BackchannelAuthenticationRequest\"]>;\n\nexport interface OidcAccountsMethods {\n findAccount(\n id: string,\n token: AuthorizationCode | AccessToken | DeviceCode | BackchannelAuthenticationRequest | undefined,\n ctx: PlatformContext\n ): Promise<Account | undefined>;\n}\n"]}
1
+ {"version":3,"file":"OidcAccountsMethods.js","sourceRoot":"","sources":["../../../src/domain/OidcAccountsMethods.ts"],"names":[],"mappings":"","sourcesContent":["import {Provider, Account} from \"oidc-provider\";\n\nexport type AuthorizationCode = InstanceType<Provider[\"AuthorizationCode\"]>;\nexport type AccessToken = InstanceType<Provider[\"AccessToken\"]>;\nexport type DeviceCode = InstanceType<Provider[\"DeviceCode\"]>;\nexport type BackchannelAuthenticationRequest = InstanceType<Provider[\"BackchannelAuthenticationRequest\"]>;\n\nexport interface OidcAccountsMethods {\n findAccount(\n id: string,\n token: AuthorizationCode | AccessToken | DeviceCode | BackchannelAuthenticationRequest | undefined\n ): Promise<Account | undefined>;\n}\n"]}
@@ -3,39 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OidcInteractionMiddleware = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const common_1 = require("@tsed/common");
6
- const constants_1 = require("../constants/constants");
7
6
  const OidcInteractionContext_1 = require("../services/OidcInteractionContext");
8
- const OidcInteractions_1 = require("../services/OidcInteractions");
9
7
  let OidcInteractionMiddleware = class OidcInteractionMiddleware {
10
- oidcInteractions;
11
- injector;
12
- async use(context) {
13
- const oidcInteraction = this.injector.invoke(OidcInteractionContext_1.OidcInteractionContext, context.container);
14
- const interactionDetails = await oidcInteraction.interactionDetails();
15
- const { uid, prompt, params, session, grantId } = interactionDetails;
16
- context.set(constants_1.INTERACTION_CONTEXT, oidcInteraction);
17
- context.set(constants_1.INTERACTION_DETAILS, interactionDetails);
18
- context.set(constants_1.INTERACTION_UID, uid);
19
- context.set(constants_1.INTERACTION_PROMPT, prompt);
20
- context.set(constants_1.INTERACTION_PARAMS, params);
21
- context.set(constants_1.INTERACTION_GRANT_ID, grantId);
22
- context.set(constants_1.INTERACTION_SESSION, session);
8
+ oidcInteractionContext;
9
+ async use() {
10
+ await this.oidcInteractionContext.interactionDetails();
23
11
  }
24
12
  };
25
13
  tslib_1.__decorate([
26
14
  (0, common_1.Inject)(),
27
- tslib_1.__metadata("design:type", OidcInteractions_1.OidcInteractions)
28
- ], OidcInteractionMiddleware.prototype, "oidcInteractions", void 0);
29
- tslib_1.__decorate([
30
- (0, common_1.Inject)(),
31
- tslib_1.__metadata("design:type", common_1.InjectorService)
32
- ], OidcInteractionMiddleware.prototype, "injector", void 0);
33
- tslib_1.__decorate([
34
- tslib_1.__param(0, (0, common_1.Context)()),
35
- tslib_1.__metadata("design:type", Function),
36
- tslib_1.__metadata("design:paramtypes", [Object]),
37
- tslib_1.__metadata("design:returntype", Promise)
38
- ], OidcInteractionMiddleware.prototype, "use", null);
15
+ tslib_1.__metadata("design:type", OidcInteractionContext_1.OidcInteractionContext)
16
+ ], OidcInteractionMiddleware.prototype, "oidcInteractionContext", void 0);
39
17
  OidcInteractionMiddleware = tslib_1.__decorate([
40
18
  (0, common_1.Middleware)()
41
19
  ], OidcInteractionMiddleware);
@@ -1 +1 @@
1
- {"version":3,"file":"OidcInteractionMiddleware.js","sourceRoot":"","sources":["../../../src/middlewares/OidcInteractionMiddleware.ts"],"names":[],"mappings":";;;;AAAA,yCAA0E;AAC1E,sDAQgC;AAChC,+EAA0E;AAC1E,mEAA8D;AAG9D,IAAa,yBAAyB,GAAtC,MAAa,yBAAyB;IAE1B,gBAAgB,CAAmB;IAGnC,QAAQ,CAAkB;IAEpC,KAAK,CAAC,GAAG,CAAY,OAAgB;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAyB,+CAAsB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAChH,MAAM,kBAAkB,GAAG,MAAM,eAAe,CAAC,kBAAkB,EAAE,CAAC;QACtE,MAAM,EAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAC,GAAG,kBAAyB,CAAC;QAE1E,OAAO,CAAC,GAAG,CAAC,+BAAmB,EAAE,eAAe,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,+BAAmB,EAAE,kBAAkB,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,2BAAe,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,8BAAkB,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,8BAAkB,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,gCAAoB,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,+BAAmB,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AAlBC;IADC,IAAA,eAAM,GAAE;sCACmB,mCAAgB;mEAAC;AAG7C;IADC,IAAA,eAAM,GAAE;sCACW,wBAAe;2DAAC;AAEpC;IAAW,mBAAA,IAAA,gBAAO,GAAE,CAAA;;;;oDAYnB;AAnBU,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CAoBrC;AApBY,8DAAyB","sourcesContent":["import {Context, Inject, InjectorService, Middleware} from \"@tsed/common\";\nimport {\n INTERACTION_CONTEXT,\n INTERACTION_DETAILS,\n INTERACTION_PARAMS,\n INTERACTION_GRANT_ID,\n INTERACTION_PROMPT,\n INTERACTION_SESSION,\n INTERACTION_UID\n} from \"../constants/constants\";\nimport {OidcInteractionContext} from \"../services/OidcInteractionContext\";\nimport {OidcInteractions} from \"../services/OidcInteractions\";\n\n@Middleware()\nexport class OidcInteractionMiddleware {\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected injector: InjectorService;\n\n async use(@Context() context: Context) {\n const oidcInteraction = this.injector.invoke<OidcInteractionContext>(OidcInteractionContext, context.container);\n const interactionDetails = await oidcInteraction.interactionDetails();\n const {uid, prompt, params, session, grantId} = interactionDetails as any;\n\n context.set(INTERACTION_CONTEXT, oidcInteraction);\n context.set(INTERACTION_DETAILS, interactionDetails);\n context.set(INTERACTION_UID, uid);\n context.set(INTERACTION_PROMPT, prompt);\n context.set(INTERACTION_PARAMS, params);\n context.set(INTERACTION_GRANT_ID, grantId);\n context.set(INTERACTION_SESSION, session);\n }\n}\n"]}
1
+ {"version":3,"file":"OidcInteractionMiddleware.js","sourceRoot":"","sources":["../../../src/middlewares/OidcInteractionMiddleware.ts"],"names":[],"mappings":";;;;AAAA,yCAA0E;AAU1E,+EAA0E;AAI1E,IAAa,yBAAyB,GAAtC,MAAa,yBAAyB;IAE1B,sBAAsB,CAAyB;IAEzD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;IACzD,CAAC;CACF,CAAA;AALC;IADC,IAAA,eAAM,GAAE;sCACyB,+CAAsB;yEAAC;AAF9C,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CAOrC;AAPY,8DAAyB","sourcesContent":["import {Context, Inject, InjectorService, Middleware} from \"@tsed/common\";\nimport {\n INTERACTION_CONTEXT,\n INTERACTION_DETAILS,\n INTERACTION_PARAMS,\n INTERACTION_GRANT_ID,\n INTERACTION_PROMPT,\n INTERACTION_SESSION,\n INTERACTION_UID\n} from \"../constants/constants\";\nimport {OidcInteractionContext} from \"../services/OidcInteractionContext\";\nimport {OidcInteractions} from \"../services/OidcInteractions\";\n\n@Middleware()\nexport class OidcInteractionMiddleware {\n @Inject()\n protected oidcInteractionContext: OidcInteractionContext;\n\n async use() {\n await this.oidcInteractionContext.interactionDetails();\n }\n}\n"]}
@@ -6,6 +6,7 @@ const common_1 = require("@tsed/common");
6
6
  const core_1 = require("@tsed/core");
7
7
  const di_1 = require("@tsed/di");
8
8
  const exceptions_1 = require("@tsed/exceptions");
9
+ const constants_1 = require("../constants/constants");
9
10
  const OidcBadInteractionName_1 = require("../domain/OidcBadInteractionName");
10
11
  const debug_1 = require("../utils/debug");
11
12
  const OidcInteractions_1 = require("./OidcInteractions");
@@ -14,8 +15,10 @@ let OidcInteractionContext = class OidcInteractionContext {
14
15
  env;
15
16
  oidcProvider;
16
17
  oidcInteractions;
17
- context;
18
- raw;
18
+ $ctx;
19
+ get raw() {
20
+ return this.$ctx.get(constants_1.INTERACTION_DETAILS);
21
+ }
19
22
  get session() {
20
23
  return this.raw.session;
21
24
  }
@@ -34,18 +37,26 @@ let OidcInteractionContext = class OidcInteractionContext {
34
37
  async runInteraction(name = this.prompt.name) {
35
38
  const handler = this.oidcInteractions.getInteractionHandler(name);
36
39
  if (handler) {
37
- await handler(this.context);
40
+ await handler(this.$ctx);
38
41
  }
39
42
  }
40
43
  async interactionDetails() {
41
- this.raw = await this.oidcProvider.get().interactionDetails(this.context.getReq(), this.context.getRes());
42
- return this.raw;
44
+ const raw = await this.oidcProvider.get().interactionDetails(this.$ctx.getReq(), this.$ctx.getRes());
45
+ const { uid, prompt, params, session, grantId } = raw;
46
+ this.$ctx.set(constants_1.INTERACTION_CONTEXT, this);
47
+ this.$ctx.set(constants_1.INTERACTION_DETAILS, raw);
48
+ this.$ctx.set(constants_1.INTERACTION_UID, uid);
49
+ this.$ctx.set(constants_1.INTERACTION_PROMPT, prompt);
50
+ this.$ctx.set(constants_1.INTERACTION_PARAMS, params);
51
+ this.$ctx.set(constants_1.INTERACTION_GRANT_ID, grantId);
52
+ this.$ctx.set(constants_1.INTERACTION_SESSION, session);
53
+ return raw;
43
54
  }
44
55
  async interactionFinished(result, options = { mergeWithLastSubmission: false }) {
45
- return this.oidcProvider.get().interactionFinished(this.context.getReq(), this.context.getRes(), result, options);
56
+ return this.oidcProvider.get().interactionFinished(this.$ctx.getReq(), this.$ctx.getRes(), result, options);
46
57
  }
47
58
  async interactionResult(result, options = { mergeWithLastSubmission: false }) {
48
- return this.oidcProvider.get().interactionResult(this.context.getReq(), this.context.getRes(), result, options);
59
+ return this.oidcProvider.get().interactionResult(this.$ctx.getReq(), this.$ctx.getRes(), result, options);
49
60
  }
50
61
  async interactionPrompt(options) {
51
62
  const client = await this.findClient();
@@ -63,17 +74,14 @@ let OidcInteractionContext = class OidcInteractionContext {
63
74
  };
64
75
  }
65
76
  async render(view, result) {
66
- return this.context.response.render(view, result);
77
+ return this.$ctx.response.render(view, result);
67
78
  }
68
79
  async save(ttl) {
69
80
  return this.raw.save(ttl);
70
81
  }
71
82
  async findClient(clientId = this.params.client_id) {
72
83
  const key = `$client:${clientId}`;
73
- if (!this.context.has(key)) {
74
- this.context.set(key, await this.oidcProvider.get().Client.find(clientId));
75
- }
76
- return this.context.get(key);
84
+ return this.$ctx.cacheAsync(key, () => this.oidcProvider.get().Client.find(clientId));
77
85
  }
78
86
  async findAccount(sub, token) {
79
87
  if (!sub && this.session) {
@@ -82,7 +90,10 @@ let OidcInteractionContext = class OidcInteractionContext {
82
90
  if (!sub) {
83
91
  return;
84
92
  }
85
- return this.oidcProvider.get().Account.findAccount(undefined, sub, token);
93
+ const key = `$account:${sub}`;
94
+ return this.$ctx.cacheAsync(key, (() => {
95
+ return this.oidcProvider.get().Account.findAccount(undefined, sub, token);
96
+ }));
86
97
  }
87
98
  async getGrant() {
88
99
  const { Grant } = this.oidcProvider.get();
@@ -137,12 +148,11 @@ tslib_1.__decorate([
137
148
  tslib_1.__metadata("design:type", OidcInteractions_1.OidcInteractions)
138
149
  ], OidcInteractionContext.prototype, "oidcInteractions", void 0);
139
150
  tslib_1.__decorate([
140
- (0, di_1.Inject)(),
151
+ (0, common_1.InjectContext)(),
141
152
  tslib_1.__metadata("design:type", common_1.PlatformContext)
142
- ], OidcInteractionContext.prototype, "context", void 0);
153
+ ], OidcInteractionContext.prototype, "$ctx", void 0);
143
154
  OidcInteractionContext = tslib_1.__decorate([
144
- (0, di_1.Injectable)(),
145
- (0, common_1.Scope)(common_1.ProviderScope.REQUEST)
155
+ (0, di_1.Injectable)()
146
156
  ], OidcInteractionContext);
147
157
  exports.OidcInteractionContext = OidcInteractionContext;
148
158
  //# sourceMappingURL=OidcInteractionContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OidcInteractionContext.js","sourceRoot":"","sources":["../../../src/services/OidcInteractionContext.ts"],"names":[],"mappings":"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","sourcesContent":["import {Constant, PlatformContext, ProviderScope, Scope} from \"@tsed/common\";\nimport {Env} from \"@tsed/core\";\nimport {Inject, Injectable} from \"@tsed/di\";\nimport {Unauthorized} from \"@tsed/exceptions\";\nimport {Account, InteractionResults, PromptDetail, Provider} from \"oidc-provider\";\nimport {OidcSession} from \"../decorators/oidcSession\";\nimport {OidcClient} from \"../domain/interfaces\";\nimport {OidcBadInteractionName} from \"../domain/OidcBadInteractionName\";\nimport {OidcInteraction} from \"../domain/OidcInteraction\";\nimport {OidcInteractionPromptProps} from \"../domain/OidcInteractionPromptProps\";\nimport {debug} from \"../utils/debug\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcProvider} from \"./OidcProvider\";\n\n@Injectable()\n@Scope(ProviderScope.REQUEST)\nexport class OidcInteractionContext {\n @Constant(\"env\")\n env: Env;\n\n @Inject()\n protected oidcProvider: OidcProvider;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected context: PlatformContext;\n\n protected raw: OidcInteraction;\n\n get session(): OidcSession | undefined {\n return this.raw.session as any;\n }\n\n get prompt(): PromptDetail {\n return this.raw.prompt;\n }\n\n get params(): Record<string, any> {\n return this.raw.params;\n }\n\n get uid(): string {\n return this.raw.uid;\n }\n\n get grantId(): string {\n return (this.raw as any).grantId;\n }\n\n async runInteraction(name: string = this.prompt.name) {\n const handler = this.oidcInteractions.getInteractionHandler(name);\n\n if (handler) {\n await handler(this.context);\n }\n }\n\n async interactionDetails(): Promise<OidcInteraction> {\n this.raw = await this.oidcProvider.get().interactionDetails(this.context.getReq(), this.context.getRes());\n\n return this.raw;\n }\n\n async interactionFinished(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionFinished(this.context.getReq(), this.context.getRes(), result, options);\n }\n\n async interactionResult(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionResult(this.context.getReq(), this.context.getRes(), result, options);\n }\n\n async interactionPrompt(options: Record<string, any>): Promise<OidcInteractionPromptProps> {\n const client = await this.findClient();\n\n return {\n client,\n uid: this.uid,\n grantId: this.grantId,\n details: this.prompt.details,\n params: {\n ...this.params,\n ...options.params\n },\n ...options,\n ...this.debug()\n };\n }\n\n async render(view: string, result: any): Promise<string> {\n return this.context.response.render(view, result);\n }\n\n async save(ttl: number): Promise<string> {\n return this.raw.save(ttl);\n }\n\n async findClient(clientId: string = this.params.client_id): Promise<OidcClient | undefined> {\n const key = `$client:${clientId}`;\n if (!this.context.has(key)) {\n this.context.set(key, await this.oidcProvider.get().Client.find(clientId));\n }\n\n return this.context.get(key);\n }\n\n async findAccount(sub?: string, token?: any): Promise<Account | undefined> {\n if (!sub && this.session) {\n sub = this.session?.accountId as any;\n }\n\n if (!sub) {\n return;\n }\n\n return this.oidcProvider.get().Account.findAccount(undefined as any, sub!, token);\n }\n\n async getGrant(): Promise<InstanceType<Provider[\"Grant\"]>> {\n const {Grant} = this.oidcProvider.get() as any;\n\n if (this.grantId) {\n // we'll be modifying existing grant in existing session\n // @ts-ignore\n return await (this.oidcProvider.get().find || Grant.find)(this.grantId);\n }\n\n return new Grant({\n accountId: this.session?.accountId,\n clientId: this.params.client_id\n });\n }\n\n checkInteractionName(name: string) {\n if (this.prompt.name !== name) {\n throw new OidcBadInteractionName(\"Bad interaction name\");\n }\n }\n\n async checkClientId(clientId = this.params.client_id) {\n const client = await this.findClient(clientId);\n\n if (!client) {\n throw new Unauthorized(`Unknown client_id ${clientId}`);\n }\n }\n\n debug(obj?: any): any {\n /* istanbul ignore next */\n if (this.env === Env.PROD) {\n return {session: undefined, dbg: {params: undefined, prompt: undefined}};\n }\n\n if (obj) {\n return debug(obj);\n }\n\n return {\n session: this.session ? this.debug(this.session) : undefined,\n dbg: {\n params: this.debug(this.params),\n prompt: this.debug(this.prompt)\n }\n };\n }\n}\n"]}
1
+ {"version":3,"file":"OidcInteractionContext.js","sourceRoot":"","sources":["../../../src/services/OidcInteractionContext.ts"],"names":[],"mappings":";;;;AAAA,yCAAsE;AACtE,qCAA+B;AAC/B,iCAA4C;AAC5C,iDAA8C;AAE9C,sDAQgC;AAGhC,6EAAwE;AAGxE,0CAAqC;AACrC,yDAAoD;AACpD,iDAA4C;AAG5C,IAAa,sBAAsB,GAAnC,MAAa,sBAAsB;IAEjC,GAAG,CAAM;IAGC,YAAY,CAAe;IAG3B,gBAAgB,CAAmB;IAGnC,IAAI,CAAkB;IAEhC,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,+BAAmB,CAAE,CAAC;IAC7C,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,GAAG,CAAC,OAAc,CAAC;IACjC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,IAAI,OAAO;QACT,OAAQ,IAAI,CAAC,GAAW,CAAC,OAAO,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,IAAI,CAAC,MAAM,CAAC,IAAI;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAElE,IAAI,OAAO,EAAE;YACX,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC1B;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAErG,MAAM,EAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAC,GAAG,GAAU,CAAC;QAE3D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,+BAAmB,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,+BAAmB,EAAE,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2BAAe,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,8BAAkB,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,8BAAkB,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gCAAoB,EAAE,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,+BAAmB,EAAE,OAAO,CAAC,CAAC;QAE5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAA0B,EAAE,UAA+C,EAAC,uBAAuB,EAAE,KAAK,EAAC;QACnI,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAA0B,EAAE,UAA+C,EAAC,uBAAuB,EAAE,KAAK,EAAC;QACjI,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5G,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAA4B;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAEvC,OAAO;YACL,MAAM;YACN,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,MAAM,EAAE;gBACN,GAAG,IAAI,CAAC,MAAM;gBACd,GAAG,OAAO,CAAC,MAAM;aAClB;YACD,GAAG,OAAO;YACV,GAAG,IAAI,CAAC,KAAK,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,MAAW;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB,IAAI,CAAC,MAAM,CAAC,SAAS;QACvD,MAAM,GAAG,GAAG,WAAW,QAAQ,EAAE,CAAC;QAElC,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAY,EAAE,KAAW;QACzC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;YACxB,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,SAAgB,CAAC;SACtC;QAED,IAAI,CAAC,GAAG,EAAE;YACR,OAAO;SACR;QAED,MAAM,GAAG,GAAG,YAAY,GAAG,EAAE,CAAC;QAE9B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAsB,GAAG,EAAE,CAAC,GAAG,EAAE;YAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,SAAgB,EAAE,GAAI,EAAE,KAAK,CAAC,CAAC;QACpF,CAAC,CAAQ,CAAC,CAAC;IACb,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,EAAC,KAAK,EAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAS,CAAC;QAE/C,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,wDAAwD;YACxD,aAAa;YACb,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACzE;QAED,OAAO,IAAI,KAAK,CAAC;YACf,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS;YAClC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;SAChC,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB,CAAC,IAAY;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,+CAAsB,CAAC,sBAAsB,CAAC,CAAC;SAC1D;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,yBAAY,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;SACzD;IACH,CAAC;IAED,KAAK,CAAC,GAAS;QACb,0BAA0B;QAC1B,IAAI,IAAI,CAAC,GAAG,KAAK,UAAG,CAAC,IAAI,EAAE;YACzB,OAAO,EAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAC,EAAC,CAAC;SAC1E;QAED,IAAI,GAAG,EAAE;YACP,OAAO,IAAA,aAAK,EAAC,GAAG,CAAC,CAAC;SACnB;QAED,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5D,GAAG,EAAE;gBACH,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC/B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;aAChC;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAjKC;IADC,IAAA,iBAAQ,EAAC,KAAK,CAAC;;mDACP;AAGT;IADC,IAAA,WAAM,GAAE;sCACe,2BAAY;4DAAC;AAGrC;IADC,IAAA,WAAM,GAAE;sCACmB,mCAAgB;gEAAC;AAG7C;IADC,IAAA,sBAAa,GAAE;sCACA,wBAAe;oDAAC;AAXrB,sBAAsB;IADlC,IAAA,eAAU,GAAE;GACA,sBAAsB,CAmKlC;AAnKY,wDAAsB","sourcesContent":["import {Constant, InjectContext, PlatformContext} from \"@tsed/common\";\nimport {Env} from \"@tsed/core\";\nimport {Inject, Injectable} from \"@tsed/di\";\nimport {Unauthorized} from \"@tsed/exceptions\";\nimport {Account, InteractionResults, PromptDetail, Provider} from \"oidc-provider\";\nimport {\n INTERACTION_CONTEXT,\n INTERACTION_DETAILS,\n INTERACTION_GRANT_ID,\n INTERACTION_PARAMS,\n INTERACTION_PROMPT,\n INTERACTION_SESSION,\n INTERACTION_UID\n} from \"../constants/constants\";\nimport {OidcSession} from \"../decorators/oidcSession\";\nimport {OidcClient} from \"../domain/interfaces\";\nimport {OidcBadInteractionName} from \"../domain/OidcBadInteractionName\";\nimport {OidcInteraction} from \"../domain/OidcInteraction\";\nimport {OidcInteractionPromptProps} from \"../domain/OidcInteractionPromptProps\";\nimport {debug} from \"../utils/debug\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcProvider} from \"./OidcProvider\";\n\n@Injectable()\nexport class OidcInteractionContext {\n @Constant(\"env\")\n env: Env;\n\n @Inject()\n protected oidcProvider: OidcProvider;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @InjectContext()\n protected $ctx: PlatformContext;\n\n get raw(): OidcInteraction {\n return this.$ctx.get(INTERACTION_DETAILS)!;\n }\n\n get session(): OidcSession | undefined {\n return this.raw.session as any;\n }\n\n get prompt(): PromptDetail {\n return this.raw.prompt;\n }\n\n get params(): Record<string, any> {\n return this.raw.params;\n }\n\n get uid(): string {\n return this.raw.uid;\n }\n\n get grantId(): string {\n return (this.raw as any).grantId;\n }\n\n async runInteraction(name: string = this.prompt.name) {\n const handler = this.oidcInteractions.getInteractionHandler(name);\n\n if (handler) {\n await handler(this.$ctx);\n }\n }\n\n async interactionDetails(): Promise<OidcInteraction> {\n const raw = await this.oidcProvider.get().interactionDetails(this.$ctx.getReq(), this.$ctx.getRes());\n\n const {uid, prompt, params, session, grantId} = raw as any;\n\n this.$ctx.set(INTERACTION_CONTEXT, this);\n this.$ctx.set(INTERACTION_DETAILS, raw);\n this.$ctx.set(INTERACTION_UID, uid);\n this.$ctx.set(INTERACTION_PROMPT, prompt);\n this.$ctx.set(INTERACTION_PARAMS, params);\n this.$ctx.set(INTERACTION_GRANT_ID, grantId);\n this.$ctx.set(INTERACTION_SESSION, session);\n\n return raw;\n }\n\n async interactionFinished(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionFinished(this.$ctx.getReq(), this.$ctx.getRes(), result, options);\n }\n\n async interactionResult(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionResult(this.$ctx.getReq(), this.$ctx.getRes(), result, options);\n }\n\n async interactionPrompt(options: Record<string, any>): Promise<OidcInteractionPromptProps> {\n const client = await this.findClient();\n\n return {\n client,\n uid: this.uid,\n grantId: this.grantId,\n details: this.prompt.details,\n params: {\n ...this.params,\n ...options.params\n },\n ...options,\n ...this.debug()\n };\n }\n\n async render(view: string, result: any): Promise<string> {\n return this.$ctx.response.render(view, result);\n }\n\n async save(ttl: number): Promise<string> {\n return this.raw.save(ttl);\n }\n\n async findClient(clientId: string = this.params.client_id): Promise<OidcClient | undefined> {\n const key = `$client:${clientId}`;\n\n return this.$ctx.cacheAsync(key, () => this.oidcProvider.get().Client.find(clientId));\n }\n\n async findAccount(sub?: string, token?: any): Promise<Account | undefined> {\n if (!sub && this.session) {\n sub = this.session?.accountId as any;\n }\n\n if (!sub) {\n return;\n }\n\n const key = `$account:${sub}`;\n\n return this.$ctx.cacheAsync<Account | undefined>(key, (() => {\n return this.oidcProvider.get().Account.findAccount(undefined as any, sub!, token);\n }) as any);\n }\n\n async getGrant(): Promise<InstanceType<Provider[\"Grant\"]>> {\n const {Grant} = this.oidcProvider.get() as any;\n\n if (this.grantId) {\n // we'll be modifying existing grant in existing session\n // @ts-ignore\n return await (this.oidcProvider.get().find || Grant.find)(this.grantId);\n }\n\n return new Grant({\n accountId: this.session?.accountId,\n clientId: this.params.client_id\n });\n }\n\n checkInteractionName(name: string) {\n if (this.prompt.name !== name) {\n throw new OidcBadInteractionName(\"Bad interaction name\");\n }\n }\n\n async checkClientId(clientId = this.params.client_id) {\n const client = await this.findClient(clientId);\n\n if (!client) {\n throw new Unauthorized(`Unknown client_id ${clientId}`);\n }\n }\n\n debug(obj?: any): any {\n /* istanbul ignore next */\n if (this.env === Env.PROD) {\n return {session: undefined, dbg: {params: undefined, prompt: undefined}};\n }\n\n if (obj) {\n return debug(obj);\n }\n\n return {\n session: this.session ? this.debug(this.session) : undefined,\n dbg: {\n params: this.debug(this.params),\n prompt: this.debug(this.prompt)\n }\n };\n }\n}\n"]}
@@ -39,7 +39,7 @@ let OidcProvider = class OidcProvider {
39
39
  jwks
40
40
  };
41
41
  if (Accounts) {
42
- configuration.findAccount = (ctx, id, token) => this.injector.get(Accounts).findAccount(id, token, ctx.req.$ctx);
42
+ configuration.findAccount = (ctx, id, token) => this.injector.get(Accounts).findAccount(id, token);
43
43
  }
44
44
  if (this.env === core_1.Env.PROD) {
45
45
  (0, core_1.setValue)(configuration, "cookies.short.secure", true);
@@ -1 +1 @@
1
- {"version":3,"file":"OidcProvider.js","sourceRoot":"","sources":["../../../src/services/OidcProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import {Env, setValue} from \"@tsed/core\";\nimport {Constant, Inject, Injectable, InjectorService} from \"@tsed/di\";\nimport {Provider as OIDCProvider, Configuration, interactionPolicy} from \"oidc-provider\";\nimport {INTERACTIONS} from \"../constants/constants\";\nimport {OidcAdapters} from \"./OidcAdapters\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcJwks} from \"./OidcJwks\";\nimport {PlatformApplication} from \"@tsed/common\";\nimport {OidcSettings} from \"../domain/OidcSettings\";\nimport {OidcAccountsMethods} from \"../domain/OidcAccountsMethods\";\n\n@Injectable()\nexport class OidcProvider {\n raw: OIDCProvider;\n\n @Constant(\"env\")\n protected env: Env;\n\n @Constant(\"httpPort\")\n protected httpPort: number | string;\n\n @Constant(\"httpsPort\")\n protected httpsPort: number | string;\n\n @Constant(\"oidc.issuer\", \"\")\n protected issuer: string;\n\n @Constant(\"oidc\")\n protected oidc: OidcSettings;\n\n @Constant(\"PLATFORM_NAME\")\n protected platformName: string;\n\n @Inject()\n protected oidcJwks: OidcJwks;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected adapters: OidcAdapters;\n\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected app: PlatformApplication;\n\n hasConfiguration() {\n return !!this.oidc;\n }\n\n async getConfiguration(): Promise<Configuration> {\n const [jwks, adapter] = await Promise.all([this.oidcJwks.getJwks(), this.adapters.createAdapterClass()]);\n const {issuer, jwksPath, secureKey, proxy, Accounts, ...options} = this.oidc;\n\n const configuration: Configuration = {\n interactions: {\n /* istanbul ignore next */\n url: (ctx, interaction) => `interaction/${interaction.uid}`\n },\n ...options,\n adapter,\n jwks\n };\n\n if (Accounts) {\n configuration.findAccount = (ctx, id, token) =>\n this.injector.get<OidcAccountsMethods>(Accounts)!.findAccount(id, token, (ctx.req as any).$ctx);\n }\n\n if (this.env === Env.PROD) {\n setValue(configuration, \"cookies.short.secure\", true);\n setValue(configuration, \"cookies.long.secure\", true);\n }\n\n const policy = this.getPolicy();\n if (policy) {\n setValue(configuration, \"interactions.policy\", policy);\n }\n\n const url = this.getInteractionsUrl();\n if (url) {\n setValue(configuration, \"interactions.url\", url);\n }\n\n return configuration;\n }\n\n getIssuer() {\n if (this.issuer) {\n return this.issuer;\n }\n\n // istanbul ignore next\n if (this.httpsPort) {\n return `https://localhost:${this.httpsPort}`;\n }\n\n return `http://localhost:${this.httpPort}`;\n }\n\n get(): OIDCProvider {\n return this.raw;\n }\n\n /**\n * Create a new instance of OidcProvider\n */\n async create(): Promise<void | OIDCProvider> {\n const {proxy, secureKey} = this.oidc;\n const configuration = await this.getConfiguration();\n const oidcProvider = new OIDCProvider(this.getIssuer(), configuration);\n\n if (proxy || this.env === Env.PROD) {\n // istanbul ignore next\n switch (this.platformName) {\n default:\n case \"express\":\n oidcProvider.proxy = true;\n break;\n case \"koa\":\n (this.app.rawApp as any).proxy = true;\n break;\n }\n }\n\n if (secureKey) {\n oidcProvider.app.keys = secureKey;\n }\n\n this.raw = oidcProvider;\n\n if (this.env !== Env.PROD) {\n this.allowHttpLocalhost();\n }\n\n await this.injector.emit(\"$onCreateOIDC\", this.raw);\n\n return this.raw;\n }\n\n private getInteractionsUrl() {\n const provider = this.injector.getProviders().find((provider) => provider.subType === INTERACTIONS);\n\n if (provider) {\n return (ctx: any, interaction: any) => {\n // eslint-disable-line no-unused-vars\n return provider.path.replace(/:uid/, interaction.uid);\n };\n }\n }\n\n private allowHttpLocalhost() {\n const {invalidate: orig} = (this.raw.Client as any).Schema.prototype;\n\n (this.raw.Client as any).Schema.prototype.invalidate = function invalidate(message: string, code: string) {\n if (code === \"implicit-force-https\" || code === \"implicit-forbid-localhost\") {\n return;\n }\n\n /* istanbul ignore next */\n return orig.call(this, message);\n };\n }\n\n private getPolicy() {\n const policy = interactionPolicy.base();\n const interactions = this.oidcInteractions.getInteractions();\n\n if (interactions.length) {\n interactions.forEach((provider) => {\n const {name, ...options} = provider.store.get(\"interactionOptions\");\n\n if (!policy.get(name)) {\n policy.add(\n new interactionPolicy.Prompt({\n name,\n ...options\n })\n );\n }\n\n const instance = this.injector.get(provider.token);\n\n if (instance.$onCreate) {\n instance.$onCreate(policy.get(name));\n }\n });\n }\n\n return this.injector.alter(\"$alterOidcPolicy\", policy);\n }\n}\n"]}
1
+ {"version":3,"file":"OidcProvider.js","sourceRoot":"","sources":["../../../src/services/OidcProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import {Env, setValue} from \"@tsed/core\";\nimport {Constant, Inject, Injectable, InjectorService} from \"@tsed/di\";\nimport {Provider as OIDCProvider, Configuration, interactionPolicy} from \"oidc-provider\";\nimport {INTERACTIONS} from \"../constants/constants\";\nimport {OidcAdapters} from \"./OidcAdapters\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcJwks} from \"./OidcJwks\";\nimport {PlatformApplication} from \"@tsed/common\";\nimport {OidcSettings} from \"../domain/OidcSettings\";\nimport {OidcAccountsMethods} from \"../domain/OidcAccountsMethods\";\n\n@Injectable()\nexport class OidcProvider {\n raw: OIDCProvider;\n\n @Constant(\"env\")\n protected env: Env;\n\n @Constant(\"httpPort\")\n protected httpPort: number | string;\n\n @Constant(\"httpsPort\")\n protected httpsPort: number | string;\n\n @Constant(\"oidc.issuer\", \"\")\n protected issuer: string;\n\n @Constant(\"oidc\")\n protected oidc: OidcSettings;\n\n @Constant(\"PLATFORM_NAME\")\n protected platformName: string;\n\n @Inject()\n protected oidcJwks: OidcJwks;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected adapters: OidcAdapters;\n\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected app: PlatformApplication;\n\n hasConfiguration() {\n return !!this.oidc;\n }\n\n async getConfiguration(): Promise<Configuration> {\n const [jwks, adapter] = await Promise.all([this.oidcJwks.getJwks(), this.adapters.createAdapterClass()]);\n const {issuer, jwksPath, secureKey, proxy, Accounts, ...options} = this.oidc;\n\n const configuration: Configuration = {\n interactions: {\n /* istanbul ignore next */\n url: (ctx, interaction) => `interaction/${interaction.uid}`\n },\n ...options,\n adapter,\n jwks\n };\n\n if (Accounts) {\n configuration.findAccount = (ctx, id, token) => this.injector.get<OidcAccountsMethods>(Accounts)!.findAccount(id, token);\n }\n\n if (this.env === Env.PROD) {\n setValue(configuration, \"cookies.short.secure\", true);\n setValue(configuration, \"cookies.long.secure\", true);\n }\n\n const policy = this.getPolicy();\n if (policy) {\n setValue(configuration, \"interactions.policy\", policy);\n }\n\n const url = this.getInteractionsUrl();\n if (url) {\n setValue(configuration, \"interactions.url\", url);\n }\n\n return configuration;\n }\n\n getIssuer() {\n if (this.issuer) {\n return this.issuer;\n }\n\n // istanbul ignore next\n if (this.httpsPort) {\n return `https://localhost:${this.httpsPort}`;\n }\n\n return `http://localhost:${this.httpPort}`;\n }\n\n get(): OIDCProvider {\n return this.raw;\n }\n\n /**\n * Create a new instance of OidcProvider\n */\n async create(): Promise<void | OIDCProvider> {\n const {proxy, secureKey} = this.oidc;\n const configuration = await this.getConfiguration();\n const oidcProvider = new OIDCProvider(this.getIssuer(), configuration);\n\n if (proxy || this.env === Env.PROD) {\n // istanbul ignore next\n switch (this.platformName) {\n default:\n case \"express\":\n oidcProvider.proxy = true;\n break;\n case \"koa\":\n (this.app.rawApp as any).proxy = true;\n break;\n }\n }\n\n if (secureKey) {\n oidcProvider.app.keys = secureKey;\n }\n\n this.raw = oidcProvider;\n\n if (this.env !== Env.PROD) {\n this.allowHttpLocalhost();\n }\n\n await this.injector.emit(\"$onCreateOIDC\", this.raw);\n\n return this.raw;\n }\n\n private getInteractionsUrl() {\n const provider = this.injector.getProviders().find((provider) => provider.subType === INTERACTIONS);\n\n if (provider) {\n return (ctx: any, interaction: any) => {\n // eslint-disable-line no-unused-vars\n return provider.path.replace(/:uid/, interaction.uid);\n };\n }\n }\n\n private allowHttpLocalhost() {\n const {invalidate: orig} = (this.raw.Client as any).Schema.prototype;\n\n (this.raw.Client as any).Schema.prototype.invalidate = function invalidate(message: string, code: string) {\n if (code === \"implicit-force-https\" || code === \"implicit-forbid-localhost\") {\n return;\n }\n\n /* istanbul ignore next */\n return orig.call(this, message);\n };\n }\n\n private getPolicy() {\n const policy = interactionPolicy.base();\n const interactions = this.oidcInteractions.getInteractions();\n\n if (interactions.length) {\n interactions.forEach((provider) => {\n const {name, ...options} = provider.store.get(\"interactionOptions\");\n\n if (!policy.get(name)) {\n policy.add(\n new interactionPolicy.Prompt({\n name,\n ...options\n })\n );\n }\n\n const instance = this.injector.get(provider.token);\n\n if (instance.$onCreate) {\n instance.$onCreate(policy.get(name));\n }\n });\n }\n\n return this.injector.alter(\"$alterOidcPolicy\", policy);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"OidcAccountsMethods.js","sourceRoot":"","sources":["../../../src/domain/OidcAccountsMethods.ts"],"names":[],"mappings":"","sourcesContent":["import {PlatformContext} from \"@tsed/common\";\nimport {Provider, Account} from \"oidc-provider\";\n\nexport type AuthorizationCode = InstanceType<Provider[\"AuthorizationCode\"]>;\nexport type AccessToken = InstanceType<Provider[\"AccessToken\"]>;\nexport type DeviceCode = InstanceType<Provider[\"DeviceCode\"]>;\nexport type BackchannelAuthenticationRequest = InstanceType<Provider[\"BackchannelAuthenticationRequest\"]>;\n\nexport interface OidcAccountsMethods {\n findAccount(\n id: string,\n token: AuthorizationCode | AccessToken | DeviceCode | BackchannelAuthenticationRequest | undefined,\n ctx: PlatformContext\n ): Promise<Account | undefined>;\n}\n"]}
1
+ {"version":3,"file":"OidcAccountsMethods.js","sourceRoot":"","sources":["../../../src/domain/OidcAccountsMethods.ts"],"names":[],"mappings":"","sourcesContent":["import {Provider, Account} from \"oidc-provider\";\n\nexport type AuthorizationCode = InstanceType<Provider[\"AuthorizationCode\"]>;\nexport type AccessToken = InstanceType<Provider[\"AccessToken\"]>;\nexport type DeviceCode = InstanceType<Provider[\"DeviceCode\"]>;\nexport type BackchannelAuthenticationRequest = InstanceType<Provider[\"BackchannelAuthenticationRequest\"]>;\n\nexport interface OidcAccountsMethods {\n findAccount(\n id: string,\n token: AuthorizationCode | AccessToken | DeviceCode | BackchannelAuthenticationRequest | undefined\n ): Promise<Account | undefined>;\n}\n"]}
@@ -1,38 +1,16 @@
1
- import { __decorate, __metadata, __param } from "tslib";
2
- import { Context, Inject, InjectorService, Middleware } from "@tsed/common";
3
- import { INTERACTION_CONTEXT, INTERACTION_DETAILS, INTERACTION_PARAMS, INTERACTION_GRANT_ID, INTERACTION_PROMPT, INTERACTION_SESSION, INTERACTION_UID } from "../constants/constants.js";
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { Inject, Middleware } from "@tsed/common";
4
3
  import { OidcInteractionContext } from "../services/OidcInteractionContext.js";
5
- import { OidcInteractions } from "../services/OidcInteractions.js";
6
4
  let OidcInteractionMiddleware = class OidcInteractionMiddleware {
7
- oidcInteractions;
8
- injector;
9
- async use(context) {
10
- const oidcInteraction = this.injector.invoke(OidcInteractionContext, context.container);
11
- const interactionDetails = await oidcInteraction.interactionDetails();
12
- const { uid, prompt, params, session, grantId } = interactionDetails;
13
- context.set(INTERACTION_CONTEXT, oidcInteraction);
14
- context.set(INTERACTION_DETAILS, interactionDetails);
15
- context.set(INTERACTION_UID, uid);
16
- context.set(INTERACTION_PROMPT, prompt);
17
- context.set(INTERACTION_PARAMS, params);
18
- context.set(INTERACTION_GRANT_ID, grantId);
19
- context.set(INTERACTION_SESSION, session);
5
+ oidcInteractionContext;
6
+ async use() {
7
+ await this.oidcInteractionContext.interactionDetails();
20
8
  }
21
9
  };
22
10
  __decorate([
23
11
  Inject(),
24
- __metadata("design:type", OidcInteractions)
25
- ], OidcInteractionMiddleware.prototype, "oidcInteractions", void 0);
26
- __decorate([
27
- Inject(),
28
- __metadata("design:type", InjectorService)
29
- ], OidcInteractionMiddleware.prototype, "injector", void 0);
30
- __decorate([
31
- __param(0, Context()),
32
- __metadata("design:type", Function),
33
- __metadata("design:paramtypes", [Object]),
34
- __metadata("design:returntype", Promise)
35
- ], OidcInteractionMiddleware.prototype, "use", null);
12
+ __metadata("design:type", OidcInteractionContext)
13
+ ], OidcInteractionMiddleware.prototype, "oidcInteractionContext", void 0);
36
14
  OidcInteractionMiddleware = __decorate([
37
15
  Middleware()
38
16
  ], OidcInteractionMiddleware);
@@ -1 +1 @@
1
- {"version":3,"file":"OidcInteractionMiddleware.js","sourceRoot":"","sources":["../../../src/middlewares/OidcInteractionMiddleware.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,sBAAsB,EAAC,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAC,gBAAgB,EAAC,MAAM,8BAA8B,CAAC;AAG9D,IAAa,yBAAyB,GAAtC,MAAa,yBAAyB;IAE1B,gBAAgB,CAAmB;IAGnC,QAAQ,CAAkB;IAEpC,KAAK,CAAC,GAAG,CAAY,OAAgB;QACnC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAyB,sBAAsB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAChH,MAAM,kBAAkB,GAAG,MAAM,eAAe,CAAC,kBAAkB,EAAE,CAAC;QACtE,MAAM,EAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAC,GAAG,kBAAyB,CAAC;QAE1E,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AAlBC;IADC,MAAM,EAAE;8BACmB,gBAAgB;mEAAC;AAG7C;IADC,MAAM,EAAE;8BACW,eAAe;2DAAC;AAEpC;IAAW,WAAA,OAAO,EAAE,CAAA;;;;oDAYnB;AAnBU,yBAAyB;IADrC,UAAU,EAAE;GACA,yBAAyB,CAoBrC;SApBY,yBAAyB","sourcesContent":["import {Context, Inject, InjectorService, Middleware} from \"@tsed/common\";\nimport {\n INTERACTION_CONTEXT,\n INTERACTION_DETAILS,\n INTERACTION_PARAMS,\n INTERACTION_GRANT_ID,\n INTERACTION_PROMPT,\n INTERACTION_SESSION,\n INTERACTION_UID\n} from \"../constants/constants\";\nimport {OidcInteractionContext} from \"../services/OidcInteractionContext\";\nimport {OidcInteractions} from \"../services/OidcInteractions\";\n\n@Middleware()\nexport class OidcInteractionMiddleware {\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected injector: InjectorService;\n\n async use(@Context() context: Context) {\n const oidcInteraction = this.injector.invoke<OidcInteractionContext>(OidcInteractionContext, context.container);\n const interactionDetails = await oidcInteraction.interactionDetails();\n const {uid, prompt, params, session, grantId} = interactionDetails as any;\n\n context.set(INTERACTION_CONTEXT, oidcInteraction);\n context.set(INTERACTION_DETAILS, interactionDetails);\n context.set(INTERACTION_UID, uid);\n context.set(INTERACTION_PROMPT, prompt);\n context.set(INTERACTION_PARAMS, params);\n context.set(INTERACTION_GRANT_ID, grantId);\n context.set(INTERACTION_SESSION, session);\n }\n}\n"]}
1
+ {"version":3,"file":"OidcInteractionMiddleware.js","sourceRoot":"","sources":["../../../src/middlewares/OidcInteractionMiddleware.ts"],"names":[],"mappings":";AAAA,OAAO,EAAU,MAAM,EAAmB,UAAU,EAAC,MAAM,cAAc,CAAC;AAU1E,OAAO,EAAC,sBAAsB,EAAC,MAAM,oCAAoC,CAAC;AAI1E,IAAa,yBAAyB,GAAtC,MAAa,yBAAyB;IAE1B,sBAAsB,CAAyB;IAEzD,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,sBAAsB,CAAC,kBAAkB,EAAE,CAAC;IACzD,CAAC;CACF,CAAA;AALC;IADC,MAAM,EAAE;8BACyB,sBAAsB;yEAAC;AAF9C,yBAAyB;IADrC,UAAU,EAAE;GACA,yBAAyB,CAOrC;SAPY,yBAAyB","sourcesContent":["import {Context, Inject, InjectorService, Middleware} from \"@tsed/common\";\nimport {\n INTERACTION_CONTEXT,\n INTERACTION_DETAILS,\n INTERACTION_PARAMS,\n INTERACTION_GRANT_ID,\n INTERACTION_PROMPT,\n INTERACTION_SESSION,\n INTERACTION_UID\n} from \"../constants/constants\";\nimport {OidcInteractionContext} from \"../services/OidcInteractionContext\";\nimport {OidcInteractions} from \"../services/OidcInteractions\";\n\n@Middleware()\nexport class OidcInteractionMiddleware {\n @Inject()\n protected oidcInteractionContext: OidcInteractionContext;\n\n async use() {\n await this.oidcInteractionContext.interactionDetails();\n }\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
- import { Constant, PlatformContext, ProviderScope, Scope } from "@tsed/common";
2
+ import { Constant, InjectContext, PlatformContext } from "@tsed/common";
3
3
  import { Env } from "@tsed/core";
4
4
  import { Inject, Injectable } from "@tsed/di";
5
5
  import { Unauthorized } from "@tsed/exceptions";
6
+ import { INTERACTION_CONTEXT, INTERACTION_DETAILS, INTERACTION_GRANT_ID, INTERACTION_PARAMS, INTERACTION_PROMPT, INTERACTION_SESSION, INTERACTION_UID } from "../constants/constants.js";
6
7
  import { OidcBadInteractionName } from "../domain/OidcBadInteractionName.js";
7
8
  import { debug } from "../utils/debug.js";
8
9
  import { OidcInteractions } from "./OidcInteractions.js";
@@ -11,8 +12,10 @@ let OidcInteractionContext = class OidcInteractionContext {
11
12
  env;
12
13
  oidcProvider;
13
14
  oidcInteractions;
14
- context;
15
- raw;
15
+ $ctx;
16
+ get raw() {
17
+ return this.$ctx.get(INTERACTION_DETAILS);
18
+ }
16
19
  get session() {
17
20
  return this.raw.session;
18
21
  }
@@ -31,18 +34,26 @@ let OidcInteractionContext = class OidcInteractionContext {
31
34
  async runInteraction(name = this.prompt.name) {
32
35
  const handler = this.oidcInteractions.getInteractionHandler(name);
33
36
  if (handler) {
34
- await handler(this.context);
37
+ await handler(this.$ctx);
35
38
  }
36
39
  }
37
40
  async interactionDetails() {
38
- this.raw = await this.oidcProvider.get().interactionDetails(this.context.getReq(), this.context.getRes());
39
- return this.raw;
41
+ const raw = await this.oidcProvider.get().interactionDetails(this.$ctx.getReq(), this.$ctx.getRes());
42
+ const { uid, prompt, params, session, grantId } = raw;
43
+ this.$ctx.set(INTERACTION_CONTEXT, this);
44
+ this.$ctx.set(INTERACTION_DETAILS, raw);
45
+ this.$ctx.set(INTERACTION_UID, uid);
46
+ this.$ctx.set(INTERACTION_PROMPT, prompt);
47
+ this.$ctx.set(INTERACTION_PARAMS, params);
48
+ this.$ctx.set(INTERACTION_GRANT_ID, grantId);
49
+ this.$ctx.set(INTERACTION_SESSION, session);
50
+ return raw;
40
51
  }
41
52
  async interactionFinished(result, options = { mergeWithLastSubmission: false }) {
42
- return this.oidcProvider.get().interactionFinished(this.context.getReq(), this.context.getRes(), result, options);
53
+ return this.oidcProvider.get().interactionFinished(this.$ctx.getReq(), this.$ctx.getRes(), result, options);
43
54
  }
44
55
  async interactionResult(result, options = { mergeWithLastSubmission: false }) {
45
- return this.oidcProvider.get().interactionResult(this.context.getReq(), this.context.getRes(), result, options);
56
+ return this.oidcProvider.get().interactionResult(this.$ctx.getReq(), this.$ctx.getRes(), result, options);
46
57
  }
47
58
  async interactionPrompt(options) {
48
59
  const client = await this.findClient();
@@ -60,17 +71,14 @@ let OidcInteractionContext = class OidcInteractionContext {
60
71
  };
61
72
  }
62
73
  async render(view, result) {
63
- return this.context.response.render(view, result);
74
+ return this.$ctx.response.render(view, result);
64
75
  }
65
76
  async save(ttl) {
66
77
  return this.raw.save(ttl);
67
78
  }
68
79
  async findClient(clientId = this.params.client_id) {
69
80
  const key = `$client:${clientId}`;
70
- if (!this.context.has(key)) {
71
- this.context.set(key, await this.oidcProvider.get().Client.find(clientId));
72
- }
73
- return this.context.get(key);
81
+ return this.$ctx.cacheAsync(key, () => this.oidcProvider.get().Client.find(clientId));
74
82
  }
75
83
  async findAccount(sub, token) {
76
84
  if (!sub && this.session) {
@@ -79,7 +87,10 @@ let OidcInteractionContext = class OidcInteractionContext {
79
87
  if (!sub) {
80
88
  return;
81
89
  }
82
- return this.oidcProvider.get().Account.findAccount(undefined, sub, token);
90
+ const key = `$account:${sub}`;
91
+ return this.$ctx.cacheAsync(key, (() => {
92
+ return this.oidcProvider.get().Account.findAccount(undefined, sub, token);
93
+ }));
83
94
  }
84
95
  async getGrant() {
85
96
  const { Grant } = this.oidcProvider.get();
@@ -134,12 +145,11 @@ __decorate([
134
145
  __metadata("design:type", OidcInteractions)
135
146
  ], OidcInteractionContext.prototype, "oidcInteractions", void 0);
136
147
  __decorate([
137
- Inject(),
148
+ InjectContext(),
138
149
  __metadata("design:type", PlatformContext)
139
- ], OidcInteractionContext.prototype, "context", void 0);
150
+ ], OidcInteractionContext.prototype, "$ctx", void 0);
140
151
  OidcInteractionContext = __decorate([
141
- Injectable(),
142
- Scope(ProviderScope.REQUEST)
152
+ Injectable()
143
153
  ], OidcInteractionContext);
144
154
  export { OidcInteractionContext };
145
155
  //# sourceMappingURL=OidcInteractionContext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OidcInteractionContext.js","sourceRoot":"","sources":["../../../src/services/OidcInteractionContext.ts"],"names":[],"mappings":"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","sourcesContent":["import {Constant, PlatformContext, ProviderScope, Scope} from \"@tsed/common\";\nimport {Env} from \"@tsed/core\";\nimport {Inject, Injectable} from \"@tsed/di\";\nimport {Unauthorized} from \"@tsed/exceptions\";\nimport {Account, InteractionResults, PromptDetail, Provider} from \"oidc-provider\";\nimport {OidcSession} from \"../decorators/oidcSession\";\nimport {OidcClient} from \"../domain/interfaces\";\nimport {OidcBadInteractionName} from \"../domain/OidcBadInteractionName\";\nimport {OidcInteraction} from \"../domain/OidcInteraction\";\nimport {OidcInteractionPromptProps} from \"../domain/OidcInteractionPromptProps\";\nimport {debug} from \"../utils/debug\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcProvider} from \"./OidcProvider\";\n\n@Injectable()\n@Scope(ProviderScope.REQUEST)\nexport class OidcInteractionContext {\n @Constant(\"env\")\n env: Env;\n\n @Inject()\n protected oidcProvider: OidcProvider;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected context: PlatformContext;\n\n protected raw: OidcInteraction;\n\n get session(): OidcSession | undefined {\n return this.raw.session as any;\n }\n\n get prompt(): PromptDetail {\n return this.raw.prompt;\n }\n\n get params(): Record<string, any> {\n return this.raw.params;\n }\n\n get uid(): string {\n return this.raw.uid;\n }\n\n get grantId(): string {\n return (this.raw as any).grantId;\n }\n\n async runInteraction(name: string = this.prompt.name) {\n const handler = this.oidcInteractions.getInteractionHandler(name);\n\n if (handler) {\n await handler(this.context);\n }\n }\n\n async interactionDetails(): Promise<OidcInteraction> {\n this.raw = await this.oidcProvider.get().interactionDetails(this.context.getReq(), this.context.getRes());\n\n return this.raw;\n }\n\n async interactionFinished(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionFinished(this.context.getReq(), this.context.getRes(), result, options);\n }\n\n async interactionResult(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionResult(this.context.getReq(), this.context.getRes(), result, options);\n }\n\n async interactionPrompt(options: Record<string, any>): Promise<OidcInteractionPromptProps> {\n const client = await this.findClient();\n\n return {\n client,\n uid: this.uid,\n grantId: this.grantId,\n details: this.prompt.details,\n params: {\n ...this.params,\n ...options.params\n },\n ...options,\n ...this.debug()\n };\n }\n\n async render(view: string, result: any): Promise<string> {\n return this.context.response.render(view, result);\n }\n\n async save(ttl: number): Promise<string> {\n return this.raw.save(ttl);\n }\n\n async findClient(clientId: string = this.params.client_id): Promise<OidcClient | undefined> {\n const key = `$client:${clientId}`;\n if (!this.context.has(key)) {\n this.context.set(key, await this.oidcProvider.get().Client.find(clientId));\n }\n\n return this.context.get(key);\n }\n\n async findAccount(sub?: string, token?: any): Promise<Account | undefined> {\n if (!sub && this.session) {\n sub = this.session?.accountId as any;\n }\n\n if (!sub) {\n return;\n }\n\n return this.oidcProvider.get().Account.findAccount(undefined as any, sub!, token);\n }\n\n async getGrant(): Promise<InstanceType<Provider[\"Grant\"]>> {\n const {Grant} = this.oidcProvider.get() as any;\n\n if (this.grantId) {\n // we'll be modifying existing grant in existing session\n // @ts-ignore\n return await (this.oidcProvider.get().find || Grant.find)(this.grantId);\n }\n\n return new Grant({\n accountId: this.session?.accountId,\n clientId: this.params.client_id\n });\n }\n\n checkInteractionName(name: string) {\n if (this.prompt.name !== name) {\n throw new OidcBadInteractionName(\"Bad interaction name\");\n }\n }\n\n async checkClientId(clientId = this.params.client_id) {\n const client = await this.findClient(clientId);\n\n if (!client) {\n throw new Unauthorized(`Unknown client_id ${clientId}`);\n }\n }\n\n debug(obj?: any): any {\n /* istanbul ignore next */\n if (this.env === Env.PROD) {\n return {session: undefined, dbg: {params: undefined, prompt: undefined}};\n }\n\n if (obj) {\n return debug(obj);\n }\n\n return {\n session: this.session ? this.debug(this.session) : undefined,\n dbg: {\n params: this.debug(this.params),\n prompt: this.debug(this.prompt)\n }\n };\n }\n}\n"]}
1
+ {"version":3,"file":"OidcInteractionContext.js","sourceRoot":"","sources":["../../../src/services/OidcInteractionContext.ts"],"names":[],"mappings":"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","sourcesContent":["import {Constant, InjectContext, PlatformContext} from \"@tsed/common\";\nimport {Env} from \"@tsed/core\";\nimport {Inject, Injectable} from \"@tsed/di\";\nimport {Unauthorized} from \"@tsed/exceptions\";\nimport {Account, InteractionResults, PromptDetail, Provider} from \"oidc-provider\";\nimport {\n INTERACTION_CONTEXT,\n INTERACTION_DETAILS,\n INTERACTION_GRANT_ID,\n INTERACTION_PARAMS,\n INTERACTION_PROMPT,\n INTERACTION_SESSION,\n INTERACTION_UID\n} from \"../constants/constants\";\nimport {OidcSession} from \"../decorators/oidcSession\";\nimport {OidcClient} from \"../domain/interfaces\";\nimport {OidcBadInteractionName} from \"../domain/OidcBadInteractionName\";\nimport {OidcInteraction} from \"../domain/OidcInteraction\";\nimport {OidcInteractionPromptProps} from \"../domain/OidcInteractionPromptProps\";\nimport {debug} from \"../utils/debug\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcProvider} from \"./OidcProvider\";\n\n@Injectable()\nexport class OidcInteractionContext {\n @Constant(\"env\")\n env: Env;\n\n @Inject()\n protected oidcProvider: OidcProvider;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @InjectContext()\n protected $ctx: PlatformContext;\n\n get raw(): OidcInteraction {\n return this.$ctx.get(INTERACTION_DETAILS)!;\n }\n\n get session(): OidcSession | undefined {\n return this.raw.session as any;\n }\n\n get prompt(): PromptDetail {\n return this.raw.prompt;\n }\n\n get params(): Record<string, any> {\n return this.raw.params;\n }\n\n get uid(): string {\n return this.raw.uid;\n }\n\n get grantId(): string {\n return (this.raw as any).grantId;\n }\n\n async runInteraction(name: string = this.prompt.name) {\n const handler = this.oidcInteractions.getInteractionHandler(name);\n\n if (handler) {\n await handler(this.$ctx);\n }\n }\n\n async interactionDetails(): Promise<OidcInteraction> {\n const raw = await this.oidcProvider.get().interactionDetails(this.$ctx.getReq(), this.$ctx.getRes());\n\n const {uid, prompt, params, session, grantId} = raw as any;\n\n this.$ctx.set(INTERACTION_CONTEXT, this);\n this.$ctx.set(INTERACTION_DETAILS, raw);\n this.$ctx.set(INTERACTION_UID, uid);\n this.$ctx.set(INTERACTION_PROMPT, prompt);\n this.$ctx.set(INTERACTION_PARAMS, params);\n this.$ctx.set(INTERACTION_GRANT_ID, grantId);\n this.$ctx.set(INTERACTION_SESSION, session);\n\n return raw;\n }\n\n async interactionFinished(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionFinished(this.$ctx.getReq(), this.$ctx.getRes(), result, options);\n }\n\n async interactionResult(result: InteractionResults, options: {mergeWithLastSubmission?: boolean} = {mergeWithLastSubmission: false}) {\n return this.oidcProvider.get().interactionResult(this.$ctx.getReq(), this.$ctx.getRes(), result, options);\n }\n\n async interactionPrompt(options: Record<string, any>): Promise<OidcInteractionPromptProps> {\n const client = await this.findClient();\n\n return {\n client,\n uid: this.uid,\n grantId: this.grantId,\n details: this.prompt.details,\n params: {\n ...this.params,\n ...options.params\n },\n ...options,\n ...this.debug()\n };\n }\n\n async render(view: string, result: any): Promise<string> {\n return this.$ctx.response.render(view, result);\n }\n\n async save(ttl: number): Promise<string> {\n return this.raw.save(ttl);\n }\n\n async findClient(clientId: string = this.params.client_id): Promise<OidcClient | undefined> {\n const key = `$client:${clientId}`;\n\n return this.$ctx.cacheAsync(key, () => this.oidcProvider.get().Client.find(clientId));\n }\n\n async findAccount(sub?: string, token?: any): Promise<Account | undefined> {\n if (!sub && this.session) {\n sub = this.session?.accountId as any;\n }\n\n if (!sub) {\n return;\n }\n\n const key = `$account:${sub}`;\n\n return this.$ctx.cacheAsync<Account | undefined>(key, (() => {\n return this.oidcProvider.get().Account.findAccount(undefined as any, sub!, token);\n }) as any);\n }\n\n async getGrant(): Promise<InstanceType<Provider[\"Grant\"]>> {\n const {Grant} = this.oidcProvider.get() as any;\n\n if (this.grantId) {\n // we'll be modifying existing grant in existing session\n // @ts-ignore\n return await (this.oidcProvider.get().find || Grant.find)(this.grantId);\n }\n\n return new Grant({\n accountId: this.session?.accountId,\n clientId: this.params.client_id\n });\n }\n\n checkInteractionName(name: string) {\n if (this.prompt.name !== name) {\n throw new OidcBadInteractionName(\"Bad interaction name\");\n }\n }\n\n async checkClientId(clientId = this.params.client_id) {\n const client = await this.findClient(clientId);\n\n if (!client) {\n throw new Unauthorized(`Unknown client_id ${clientId}`);\n }\n }\n\n debug(obj?: any): any {\n /* istanbul ignore next */\n if (this.env === Env.PROD) {\n return {session: undefined, dbg: {params: undefined, prompt: undefined}};\n }\n\n if (obj) {\n return debug(obj);\n }\n\n return {\n session: this.session ? this.debug(this.session) : undefined,\n dbg: {\n params: this.debug(this.params),\n prompt: this.debug(this.prompt)\n }\n };\n }\n}\n"]}
@@ -36,7 +36,7 @@ let OidcProvider = class OidcProvider {
36
36
  jwks
37
37
  };
38
38
  if (Accounts) {
39
- configuration.findAccount = (ctx, id, token) => this.injector.get(Accounts).findAccount(id, token, ctx.req.$ctx);
39
+ configuration.findAccount = (ctx, id, token) => this.injector.get(Accounts).findAccount(id, token);
40
40
  }
41
41
  if (this.env === Env.PROD) {
42
42
  setValue(configuration, "cookies.short.secure", true);
@@ -1 +1 @@
1
- {"version":3,"file":"OidcProvider.js","sourceRoot":"","sources":["../../../src/services/OidcProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import {Env, setValue} from \"@tsed/core\";\nimport {Constant, Inject, Injectable, InjectorService} from \"@tsed/di\";\nimport {Provider as OIDCProvider, Configuration, interactionPolicy} from \"oidc-provider\";\nimport {INTERACTIONS} from \"../constants/constants\";\nimport {OidcAdapters} from \"./OidcAdapters\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcJwks} from \"./OidcJwks\";\nimport {PlatformApplication} from \"@tsed/common\";\nimport {OidcSettings} from \"../domain/OidcSettings\";\nimport {OidcAccountsMethods} from \"../domain/OidcAccountsMethods\";\n\n@Injectable()\nexport class OidcProvider {\n raw: OIDCProvider;\n\n @Constant(\"env\")\n protected env: Env;\n\n @Constant(\"httpPort\")\n protected httpPort: number | string;\n\n @Constant(\"httpsPort\")\n protected httpsPort: number | string;\n\n @Constant(\"oidc.issuer\", \"\")\n protected issuer: string;\n\n @Constant(\"oidc\")\n protected oidc: OidcSettings;\n\n @Constant(\"PLATFORM_NAME\")\n protected platformName: string;\n\n @Inject()\n protected oidcJwks: OidcJwks;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected adapters: OidcAdapters;\n\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected app: PlatformApplication;\n\n hasConfiguration() {\n return !!this.oidc;\n }\n\n async getConfiguration(): Promise<Configuration> {\n const [jwks, adapter] = await Promise.all([this.oidcJwks.getJwks(), this.adapters.createAdapterClass()]);\n const {issuer, jwksPath, secureKey, proxy, Accounts, ...options} = this.oidc;\n\n const configuration: Configuration = {\n interactions: {\n /* istanbul ignore next */\n url: (ctx, interaction) => `interaction/${interaction.uid}`\n },\n ...options,\n adapter,\n jwks\n };\n\n if (Accounts) {\n configuration.findAccount = (ctx, id, token) =>\n this.injector.get<OidcAccountsMethods>(Accounts)!.findAccount(id, token, (ctx.req as any).$ctx);\n }\n\n if (this.env === Env.PROD) {\n setValue(configuration, \"cookies.short.secure\", true);\n setValue(configuration, \"cookies.long.secure\", true);\n }\n\n const policy = this.getPolicy();\n if (policy) {\n setValue(configuration, \"interactions.policy\", policy);\n }\n\n const url = this.getInteractionsUrl();\n if (url) {\n setValue(configuration, \"interactions.url\", url);\n }\n\n return configuration;\n }\n\n getIssuer() {\n if (this.issuer) {\n return this.issuer;\n }\n\n // istanbul ignore next\n if (this.httpsPort) {\n return `https://localhost:${this.httpsPort}`;\n }\n\n return `http://localhost:${this.httpPort}`;\n }\n\n get(): OIDCProvider {\n return this.raw;\n }\n\n /**\n * Create a new instance of OidcProvider\n */\n async create(): Promise<void | OIDCProvider> {\n const {proxy, secureKey} = this.oidc;\n const configuration = await this.getConfiguration();\n const oidcProvider = new OIDCProvider(this.getIssuer(), configuration);\n\n if (proxy || this.env === Env.PROD) {\n // istanbul ignore next\n switch (this.platformName) {\n default:\n case \"express\":\n oidcProvider.proxy = true;\n break;\n case \"koa\":\n (this.app.rawApp as any).proxy = true;\n break;\n }\n }\n\n if (secureKey) {\n oidcProvider.app.keys = secureKey;\n }\n\n this.raw = oidcProvider;\n\n if (this.env !== Env.PROD) {\n this.allowHttpLocalhost();\n }\n\n await this.injector.emit(\"$onCreateOIDC\", this.raw);\n\n return this.raw;\n }\n\n private getInteractionsUrl() {\n const provider = this.injector.getProviders().find((provider) => provider.subType === INTERACTIONS);\n\n if (provider) {\n return (ctx: any, interaction: any) => {\n // eslint-disable-line no-unused-vars\n return provider.path.replace(/:uid/, interaction.uid);\n };\n }\n }\n\n private allowHttpLocalhost() {\n const {invalidate: orig} = (this.raw.Client as any).Schema.prototype;\n\n (this.raw.Client as any).Schema.prototype.invalidate = function invalidate(message: string, code: string) {\n if (code === \"implicit-force-https\" || code === \"implicit-forbid-localhost\") {\n return;\n }\n\n /* istanbul ignore next */\n return orig.call(this, message);\n };\n }\n\n private getPolicy() {\n const policy = interactionPolicy.base();\n const interactions = this.oidcInteractions.getInteractions();\n\n if (interactions.length) {\n interactions.forEach((provider) => {\n const {name, ...options} = provider.store.get(\"interactionOptions\");\n\n if (!policy.get(name)) {\n policy.add(\n new interactionPolicy.Prompt({\n name,\n ...options\n })\n );\n }\n\n const instance = this.injector.get(provider.token);\n\n if (instance.$onCreate) {\n instance.$onCreate(policy.get(name));\n }\n });\n }\n\n return this.injector.alter(\"$alterOidcPolicy\", policy);\n }\n}\n"]}
1
+ {"version":3,"file":"OidcProvider.js","sourceRoot":"","sources":["../../../src/services/OidcProvider.ts"],"names":[],"mappings":"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","sourcesContent":["import {Env, setValue} from \"@tsed/core\";\nimport {Constant, Inject, Injectable, InjectorService} from \"@tsed/di\";\nimport {Provider as OIDCProvider, Configuration, interactionPolicy} from \"oidc-provider\";\nimport {INTERACTIONS} from \"../constants/constants\";\nimport {OidcAdapters} from \"./OidcAdapters\";\nimport {OidcInteractions} from \"./OidcInteractions\";\nimport {OidcJwks} from \"./OidcJwks\";\nimport {PlatformApplication} from \"@tsed/common\";\nimport {OidcSettings} from \"../domain/OidcSettings\";\nimport {OidcAccountsMethods} from \"../domain/OidcAccountsMethods\";\n\n@Injectable()\nexport class OidcProvider {\n raw: OIDCProvider;\n\n @Constant(\"env\")\n protected env: Env;\n\n @Constant(\"httpPort\")\n protected httpPort: number | string;\n\n @Constant(\"httpsPort\")\n protected httpsPort: number | string;\n\n @Constant(\"oidc.issuer\", \"\")\n protected issuer: string;\n\n @Constant(\"oidc\")\n protected oidc: OidcSettings;\n\n @Constant(\"PLATFORM_NAME\")\n protected platformName: string;\n\n @Inject()\n protected oidcJwks: OidcJwks;\n\n @Inject()\n protected oidcInteractions: OidcInteractions;\n\n @Inject()\n protected adapters: OidcAdapters;\n\n @Inject()\n protected injector: InjectorService;\n\n @Inject()\n protected app: PlatformApplication;\n\n hasConfiguration() {\n return !!this.oidc;\n }\n\n async getConfiguration(): Promise<Configuration> {\n const [jwks, adapter] = await Promise.all([this.oidcJwks.getJwks(), this.adapters.createAdapterClass()]);\n const {issuer, jwksPath, secureKey, proxy, Accounts, ...options} = this.oidc;\n\n const configuration: Configuration = {\n interactions: {\n /* istanbul ignore next */\n url: (ctx, interaction) => `interaction/${interaction.uid}`\n },\n ...options,\n adapter,\n jwks\n };\n\n if (Accounts) {\n configuration.findAccount = (ctx, id, token) => this.injector.get<OidcAccountsMethods>(Accounts)!.findAccount(id, token);\n }\n\n if (this.env === Env.PROD) {\n setValue(configuration, \"cookies.short.secure\", true);\n setValue(configuration, \"cookies.long.secure\", true);\n }\n\n const policy = this.getPolicy();\n if (policy) {\n setValue(configuration, \"interactions.policy\", policy);\n }\n\n const url = this.getInteractionsUrl();\n if (url) {\n setValue(configuration, \"interactions.url\", url);\n }\n\n return configuration;\n }\n\n getIssuer() {\n if (this.issuer) {\n return this.issuer;\n }\n\n // istanbul ignore next\n if (this.httpsPort) {\n return `https://localhost:${this.httpsPort}`;\n }\n\n return `http://localhost:${this.httpPort}`;\n }\n\n get(): OIDCProvider {\n return this.raw;\n }\n\n /**\n * Create a new instance of OidcProvider\n */\n async create(): Promise<void | OIDCProvider> {\n const {proxy, secureKey} = this.oidc;\n const configuration = await this.getConfiguration();\n const oidcProvider = new OIDCProvider(this.getIssuer(), configuration);\n\n if (proxy || this.env === Env.PROD) {\n // istanbul ignore next\n switch (this.platformName) {\n default:\n case \"express\":\n oidcProvider.proxy = true;\n break;\n case \"koa\":\n (this.app.rawApp as any).proxy = true;\n break;\n }\n }\n\n if (secureKey) {\n oidcProvider.app.keys = secureKey;\n }\n\n this.raw = oidcProvider;\n\n if (this.env !== Env.PROD) {\n this.allowHttpLocalhost();\n }\n\n await this.injector.emit(\"$onCreateOIDC\", this.raw);\n\n return this.raw;\n }\n\n private getInteractionsUrl() {\n const provider = this.injector.getProviders().find((provider) => provider.subType === INTERACTIONS);\n\n if (provider) {\n return (ctx: any, interaction: any) => {\n // eslint-disable-line no-unused-vars\n return provider.path.replace(/:uid/, interaction.uid);\n };\n }\n }\n\n private allowHttpLocalhost() {\n const {invalidate: orig} = (this.raw.Client as any).Schema.prototype;\n\n (this.raw.Client as any).Schema.prototype.invalidate = function invalidate(message: string, code: string) {\n if (code === \"implicit-force-https\" || code === \"implicit-forbid-localhost\") {\n return;\n }\n\n /* istanbul ignore next */\n return orig.call(this, message);\n };\n }\n\n private getPolicy() {\n const policy = interactionPolicy.base();\n const interactions = this.oidcInteractions.getInteractions();\n\n if (interactions.length) {\n interactions.forEach((provider) => {\n const {name, ...options} = provider.store.get(\"interactionOptions\");\n\n if (!policy.get(name)) {\n policy.add(\n new interactionPolicy.Prompt({\n name,\n ...options\n })\n );\n }\n\n const instance = this.injector.get(provider.token);\n\n if (instance.$onCreate) {\n instance.$onCreate(policy.get(name));\n }\n });\n }\n\n return this.injector.alter(\"$alterOidcPolicy\", policy);\n }\n}\n"]}
@@ -1,9 +1,8 @@
1
- import { PlatformContext } from "@tsed/common";
2
1
  import { Provider, Account } from "oidc-provider";
3
2
  export declare type AuthorizationCode = InstanceType<Provider["AuthorizationCode"]>;
4
3
  export declare type AccessToken = InstanceType<Provider["AccessToken"]>;
5
4
  export declare type DeviceCode = InstanceType<Provider["DeviceCode"]>;
6
5
  export declare type BackchannelAuthenticationRequest = InstanceType<Provider["BackchannelAuthenticationRequest"]>;
7
6
  export interface OidcAccountsMethods {
8
- findAccount(id: string, token: AuthorizationCode | AccessToken | DeviceCode | BackchannelAuthenticationRequest | undefined, ctx: PlatformContext): Promise<Account | undefined>;
7
+ findAccount(id: string, token: AuthorizationCode | AccessToken | DeviceCode | BackchannelAuthenticationRequest | undefined): Promise<Account | undefined>;
9
8
  }
@@ -1,7 +1,5 @@
1
- import { Context, InjectorService } from "@tsed/common";
2
- import { OidcInteractions } from "../services/OidcInteractions";
1
+ import { OidcInteractionContext } from "../services/OidcInteractionContext";
3
2
  export declare class OidcInteractionMiddleware {
4
- protected oidcInteractions: OidcInteractions;
5
- protected injector: InjectorService;
6
- use(context: Context): Promise<void>;
3
+ protected oidcInteractionContext: OidcInteractionContext;
4
+ use(): Promise<void>;
7
5
  }
@@ -11,8 +11,8 @@ export declare class OidcInteractionContext {
11
11
  env: Env;
12
12
  protected oidcProvider: OidcProvider;
13
13
  protected oidcInteractions: OidcInteractions;
14
- protected context: PlatformContext;
15
- protected raw: OidcInteraction;
14
+ protected $ctx: PlatformContext;
15
+ get raw(): OidcInteraction;
16
16
  get session(): OidcSession | undefined;
17
17
  get prompt(): PromptDetail;
18
18
  get params(): Record<string, any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tsed/oidc-provider",
3
- "version": "6.123.0",
3
+ "version": "6.123.1",
4
4
  "description": "OIDC provider package for Ts.ED framework",
5
5
  "private": false,
6
6
  "source": "./src/index.ts",
@@ -22,7 +22,7 @@
22
22
  "test": "cross-env NODE_ENV=test yarn jest --max-workers=2"
23
23
  },
24
24
  "dependencies": {
25
- "@tsed/adapters": "6.123.0",
25
+ "@tsed/adapters": "6.123.1",
26
26
  "express-urlrewrite": "^1.4.0",
27
27
  "jose2": "npm:jose@^2.0.4",
28
28
  "koa-mount": "^4.0.0",
@@ -32,17 +32,17 @@
32
32
  "uuid": "8.3.2"
33
33
  },
34
34
  "devDependencies": {
35
- "@tsed/common": "6.123.0",
36
- "@tsed/core": "6.123.0",
37
- "@tsed/di": "6.123.0",
38
- "@tsed/exceptions": "6.123.0",
35
+ "@tsed/common": "6.123.1",
36
+ "@tsed/core": "6.123.1",
37
+ "@tsed/di": "6.123.1",
38
+ "@tsed/exceptions": "6.123.1",
39
39
  "@types/lowdb": "1.0.11",
40
40
  "@types/oidc-provider": "^7.1.1",
41
41
  "@types/uuid": "8.3.4",
42
42
  "oidc-provider": "7.11.1"
43
43
  },
44
44
  "peerDependencies": {
45
- "@tsed/common": "^6.123.0",
45
+ "@tsed/common": "^6.123.1",
46
46
  "oidc-provider": ">=7.3.0"
47
47
  },
48
48
  "peerDependenciesMeta": {