@node-c/domain-iam-okta 1.0.0-beta0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1 @@
1
+ MIT
package/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # Node-C / Domain: IAM Okta
2
+ This is a plugin for Node-C's "Domain: IAM" package. It adds Okta auth to the standard set of authentication methods provided by the "Domain: IAM" package.
3
+
4
+ The documentation can be found on the [Node-C Github repo homepage](https://github.com/RazorDude/node-c).
@@ -0,0 +1 @@
1
+ export * from './services';
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./services"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B"}
@@ -0,0 +1,23 @@
1
+ import { IAMAuthenticationGetUserDataFromExternalTokenPayloadsData, IAMAuthenticationGetUserDataFromExternalTokenPayloadsResult, IAMAuthenticationOAuth2CompleteData, IAMAuthenticationOAuth2CompleteOptions, IAMAuthenticationOAuth2CompleteResult, IAMAuthenticationOAuth2GetUserCreateAccessTokenConfigResult, IAMAuthenticationOAuth2InitiateData, IAMAuthenticationOAuth2InitiateOptions, IAMAuthenticationOAuth2InitiateResult, IAMAuthenticationRefreshExternalAccessTokenData, IAMAuthenticationRefreshExternalAccessTokenResult } from '@node-c/domain-iam';
2
+ export type IAMAuthenticationOktaCompleteData = IAMAuthenticationOAuth2CompleteData;
3
+ export type IAMAuthenticationOktaCompleteOptions<Context extends object> = IAMAuthenticationOAuth2CompleteOptions<Context>;
4
+ export interface IAMAuthenticationOktaCompleteResult extends IAMAuthenticationOAuth2CompleteResult {
5
+ idToken: string;
6
+ refreshToken: string;
7
+ }
8
+ export type IAMAuthenticationOktaGetUserCreateAccessTokenConfigResult = IAMAuthenticationOAuth2GetUserCreateAccessTokenConfigResult;
9
+ export type IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsData = IAMAuthenticationGetUserDataFromExternalTokenPayloadsData;
10
+ export type IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsResult = IAMAuthenticationGetUserDataFromExternalTokenPayloadsResult;
11
+ export interface IAMAuthenticationOktaInitiateData extends IAMAuthenticationOAuth2InitiateData {
12
+ scope: string;
13
+ }
14
+ export type IAMAuthenticationOktaInitiateOptions<Context extends object> = Omit<IAMAuthenticationOAuth2InitiateOptions<Context>, 'generateNonce' | 'withPCKE'>;
15
+ export interface IAMAuthenticationOktaInitiateResult extends IAMAuthenticationOAuth2InitiateResult {
16
+ authorizationCodeRequestURL: string;
17
+ codeChallenge: string;
18
+ codeVerifier: string;
19
+ nonce: string;
20
+ state: string;
21
+ }
22
+ export type IAMAuthenticationOktaRefreshExternalAccessTokenData = IAMAuthenticationRefreshExternalAccessTokenData;
23
+ export type IAMAuthenticationOktaRefreshExternalAccessTokenResult = IAMAuthenticationRefreshExternalAccessTokenResult;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=iam.authenticationOkta.definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam.authenticationOkta.definitions.js","sourceRoot":"","sources":["../../../src/services/authenticationOkta/iam.authenticationOkta.definitions.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { ConfigProviderService } from '@node-c/core';
2
+ import { IAMAuthenticationOAuth2Service } from '@node-c/domain-iam';
3
+ import { IAMAuthenticationOktaCompleteData, IAMAuthenticationOktaCompleteOptions, IAMAuthenticationOktaCompleteResult, IAMAuthenticationOktaGetUserCreateAccessTokenConfigResult, IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsData, IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsResult, IAMAuthenticationOktaInitiateData, IAMAuthenticationOktaInitiateOptions, IAMAuthenticationOktaInitiateResult, IAMAuthenticationOktaRefreshExternalAccessTokenData, IAMAuthenticationOktaRefreshExternalAccessTokenResult } from './iam.authenticationOkta.definitions';
4
+ export declare class IAMAuthenticationOktaService<CompleteContext extends object, InitiateContext extends object> extends IAMAuthenticationOAuth2Service<CompleteContext, InitiateContext> {
5
+ protected configProvider: ConfigProviderService;
6
+ protected moduleName: string;
7
+ protected serviceName: string;
8
+ constructor(configProvider: ConfigProviderService, moduleName: string, serviceName: string);
9
+ complete(data: IAMAuthenticationOktaCompleteData, options: IAMAuthenticationOktaCompleteOptions<CompleteContext>): Promise<IAMAuthenticationOktaCompleteResult>;
10
+ getUserDataFromExternalTokenPayloads(data: IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsData): Promise<IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsResult | null>;
11
+ getUserCreateAccessTokenConfig(): IAMAuthenticationOktaGetUserCreateAccessTokenConfigResult;
12
+ initiate(data: IAMAuthenticationOktaInitiateData, options: IAMAuthenticationOktaInitiateOptions<InitiateContext>): Promise<IAMAuthenticationOktaInitiateResult>;
13
+ refreshExternalAccessToken(_data: IAMAuthenticationOktaRefreshExternalAccessTokenData): Promise<IAMAuthenticationOktaRefreshExternalAccessTokenResult>;
14
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.IAMAuthenticationOktaService = void 0;
16
+ const core_1 = require("@node-c/core");
17
+ const domain_iam_1 = require("@node-c/domain-iam");
18
+ const lodash_1 = __importDefault(require("lodash"));
19
+ class IAMAuthenticationOktaService extends domain_iam_1.IAMAuthenticationOAuth2Service {
20
+ constructor(configProvider, moduleName, serviceName) {
21
+ super(configProvider, moduleName, serviceName);
22
+ this.configProvider = configProvider;
23
+ this.moduleName = moduleName;
24
+ this.serviceName = serviceName;
25
+ }
26
+ complete(data, options) {
27
+ const _super = Object.create(null, {
28
+ complete: { get: () => super.complete }
29
+ });
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ return _super.complete.call(this, data, options);
32
+ });
33
+ }
34
+ getUserDataFromExternalTokenPayloads(data) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ const { idTokenPayload } = data;
37
+ if (!idTokenPayload) {
38
+ return null;
39
+ }
40
+ const nameData = idTokenPayload.name.split(' ');
41
+ return { email: idTokenPayload.email, firstName: nameData[0], lastName: nameData[nameData.length - 1] };
42
+ });
43
+ }
44
+ getUserCreateAccessTokenConfig() {
45
+ const { configProvider, moduleName, serviceName } = this;
46
+ const moduleConfig = configProvider.config.domain[moduleName];
47
+ const { steps } = moduleConfig.authServiceSettings[serviceName];
48
+ const defaultConfig = {
49
+ [core_1.AppConfigDomainIAMAuthenticationStep.Complete]: {
50
+ authReturnsTokens: true,
51
+ cache: {
52
+ settings: {
53
+ cacheFieldName: 'state',
54
+ inputFieldName: 'data.state'
55
+ },
56
+ use: {
57
+ data: { overwrite: true, use: true }
58
+ }
59
+ },
60
+ createUser: true,
61
+ decodeReturnedTokens: true,
62
+ findUser: true,
63
+ findUserBeforeAuth: false,
64
+ findUserInAuthResultBy: {
65
+ userFieldName: 'email',
66
+ resultFieldName: 'idTokenPayload.email'
67
+ },
68
+ useReturnedTokens: true,
69
+ validWithoutUser: false
70
+ },
71
+ [core_1.AppConfigDomainIAMAuthenticationStep.Initiate]: {
72
+ cache: {
73
+ populate: {
74
+ data: [{ cacheFieldName: 'codeVerifier', inputFieldName: 'result.codeVerifier' }]
75
+ },
76
+ settings: {
77
+ cacheFieldName: 'state',
78
+ inputFieldName: 'result.state'
79
+ }
80
+ },
81
+ findUser: false,
82
+ stepResultPublicFields: ['authorizationCodeRequestURL'],
83
+ validWithoutUser: true
84
+ }
85
+ };
86
+ return lodash_1.default.merge(defaultConfig, steps);
87
+ }
88
+ initiate(data, options) {
89
+ const _super = Object.create(null, {
90
+ initiate: { get: () => super.initiate }
91
+ });
92
+ return __awaiter(this, void 0, void 0, function* () {
93
+ return _super.initiate.call(this, data, Object.assign(Object.assign({}, options), { generateNonce: true, withPCKE: true }));
94
+ });
95
+ }
96
+ refreshExternalAccessToken(_data) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ throw new core_1.ApplicationError(`[${this.moduleName}][${this.serviceName}}]: Method "refreshExternalAccessToken" not implemented.`);
99
+ });
100
+ }
101
+ }
102
+ exports.IAMAuthenticationOktaService = IAMAuthenticationOktaService;
103
+ //# sourceMappingURL=iam.authenticationOkta.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam.authenticationOkta.service.js","sourceRoot":"","sources":["../../../src/services/authenticationOkta/iam.authenticationOkta.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './iam.authenticationOkta.definitions';
2
+ export * from './iam.authenticationOkta.service';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./iam.authenticationOkta.definitions"), exports);
18
+ __exportStar(require("./iam.authenticationOkta.service"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/authenticationOkta/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uEAAqD;AACrD,mEAAiD"}
@@ -0,0 +1 @@
1
+ export * from './authenticationOkta';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./authenticationOkta"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC"}
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@node-c/domain-iam-okta",
3
+ "version": "1.0.0-beta0",
4
+ "license": "MIT",
5
+ "main": "dist/index.js",
6
+ "scripts": {
7
+ "build": "tsc -p tsconfig.build.json",
8
+ "build:clean": "rm -rf dist/* && rm -f *.tsbuildinfo && npm run build",
9
+ "check-types": "tsc -p tsconfig.build.json --noEmit",
10
+ "dev": "tsc -p tsconfig.build.json --watch",
11
+ "lint": "eslint src",
12
+ "publish-package": "npm run build:clean && npm publish --access public",
13
+ "test": "vitest --config src/vitest.config.ts",
14
+ "test:coverage": "vitest --config src/vitest.config.ts --coverage"
15
+ },
16
+ "dependencies": {
17
+ "@nestjs/common": "^11.1.16",
18
+ "@node-c/core": "^1.0.0-beta0",
19
+ "@node-c/domain-iam": "^1.0.0-beta0"
20
+ }
21
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './services';
@@ -0,0 +1,52 @@
1
+ import {
2
+ IAMAuthenticationGetUserDataFromExternalTokenPayloadsData,
3
+ IAMAuthenticationGetUserDataFromExternalTokenPayloadsResult,
4
+ IAMAuthenticationOAuth2CompleteData,
5
+ IAMAuthenticationOAuth2CompleteOptions,
6
+ IAMAuthenticationOAuth2CompleteResult,
7
+ IAMAuthenticationOAuth2GetUserCreateAccessTokenConfigResult,
8
+ IAMAuthenticationOAuth2InitiateData,
9
+ IAMAuthenticationOAuth2InitiateOptions,
10
+ IAMAuthenticationOAuth2InitiateResult,
11
+ IAMAuthenticationRefreshExternalAccessTokenData,
12
+ IAMAuthenticationRefreshExternalAccessTokenResult
13
+ } from '@node-c/domain-iam';
14
+
15
+ export type IAMAuthenticationOktaCompleteData = IAMAuthenticationOAuth2CompleteData;
16
+
17
+ export type IAMAuthenticationOktaCompleteOptions<Context extends object> =
18
+ IAMAuthenticationOAuth2CompleteOptions<Context>;
19
+
20
+ export interface IAMAuthenticationOktaCompleteResult extends IAMAuthenticationOAuth2CompleteResult {
21
+ idToken: string;
22
+ refreshToken: string;
23
+ }
24
+
25
+ export type IAMAuthenticationOktaGetUserCreateAccessTokenConfigResult =
26
+ IAMAuthenticationOAuth2GetUserCreateAccessTokenConfigResult;
27
+
28
+ export type IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsData =
29
+ IAMAuthenticationGetUserDataFromExternalTokenPayloadsData;
30
+
31
+ export type IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsResult =
32
+ IAMAuthenticationGetUserDataFromExternalTokenPayloadsResult;
33
+
34
+ export interface IAMAuthenticationOktaInitiateData extends IAMAuthenticationOAuth2InitiateData {
35
+ scope: string;
36
+ }
37
+
38
+ export type IAMAuthenticationOktaInitiateOptions<Context extends object> = Omit<
39
+ IAMAuthenticationOAuth2InitiateOptions<Context>,
40
+ 'generateNonce' | 'withPCKE'
41
+ >;
42
+
43
+ export interface IAMAuthenticationOktaInitiateResult extends IAMAuthenticationOAuth2InitiateResult {
44
+ authorizationCodeRequestURL: string;
45
+ codeChallenge: string;
46
+ codeVerifier: string;
47
+ nonce: string;
48
+ state: string;
49
+ }
50
+
51
+ export type IAMAuthenticationOktaRefreshExternalAccessTokenData = IAMAuthenticationRefreshExternalAccessTokenData;
52
+ export type IAMAuthenticationOktaRefreshExternalAccessTokenResult = IAMAuthenticationRefreshExternalAccessTokenResult;
@@ -0,0 +1,124 @@
1
+ import {
2
+ AppConfigDomainIAM,
3
+ AppConfigDomainIAMAuthenticationStep,
4
+ ApplicationError,
5
+ ConfigProviderService
6
+ } from '@node-c/core';
7
+ import { IAMAuthenticationOAuth2Service } from '@node-c/domain-iam';
8
+
9
+ import ld from 'lodash';
10
+
11
+ import {
12
+ IAMAuthenticationOktaCompleteData,
13
+ IAMAuthenticationOktaCompleteOptions,
14
+ IAMAuthenticationOktaCompleteResult,
15
+ IAMAuthenticationOktaGetUserCreateAccessTokenConfigResult,
16
+ IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsData,
17
+ IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsResult,
18
+ IAMAuthenticationOktaInitiateData,
19
+ IAMAuthenticationOktaInitiateOptions,
20
+ IAMAuthenticationOktaInitiateResult,
21
+ IAMAuthenticationOktaRefreshExternalAccessTokenData,
22
+ IAMAuthenticationOktaRefreshExternalAccessTokenResult
23
+ } from './iam.authenticationOkta.definitions';
24
+
25
+ /*
26
+ * A service for integrating Okta OIDC auth. It extends the Domain-IAM-OAuth2.
27
+ */
28
+ export class IAMAuthenticationOktaService<
29
+ CompleteContext extends object,
30
+ InitiateContext extends object
31
+ > extends IAMAuthenticationOAuth2Service<CompleteContext, InitiateContext> {
32
+ constructor(
33
+ protected configProvider: ConfigProviderService,
34
+ protected moduleName: string,
35
+ protected serviceName: string
36
+ ) {
37
+ super(configProvider, moduleName, serviceName);
38
+ }
39
+
40
+ async complete(
41
+ data: IAMAuthenticationOktaCompleteData,
42
+ options: IAMAuthenticationOktaCompleteOptions<CompleteContext>
43
+ ): Promise<IAMAuthenticationOktaCompleteResult> {
44
+ return super.complete(data, options) as Promise<IAMAuthenticationOktaCompleteResult>;
45
+ }
46
+
47
+ async getUserDataFromExternalTokenPayloads(
48
+ data: IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsData
49
+ ): Promise<IAMAuthenticationOktaGetUserDataFromExternalTokenPayloadsResult | null> {
50
+ const { idTokenPayload } = data;
51
+ if (!idTokenPayload) {
52
+ return null;
53
+ }
54
+ const nameData = idTokenPayload.name.split(' ');
55
+ return { email: idTokenPayload.email, firstName: nameData[0], lastName: nameData[nameData.length - 1] };
56
+ }
57
+
58
+ // Okta Auth via OIDC
59
+ getUserCreateAccessTokenConfig(): IAMAuthenticationOktaGetUserCreateAccessTokenConfigResult {
60
+ const { configProvider, moduleName, serviceName } = this;
61
+ const moduleConfig = configProvider.config.domain[moduleName] as AppConfigDomainIAM;
62
+ const { steps } = moduleConfig.authServiceSettings![serviceName];
63
+ const defaultConfig: IAMAuthenticationOktaGetUserCreateAccessTokenConfigResult = {
64
+ [AppConfigDomainIAMAuthenticationStep.Complete]: {
65
+ authReturnsTokens: true,
66
+ cache: {
67
+ settings: {
68
+ cacheFieldName: 'state',
69
+ inputFieldName: 'data.state'
70
+ },
71
+ use: {
72
+ data: { overwrite: true, use: true }
73
+ }
74
+ },
75
+ createUser: true,
76
+ decodeReturnedTokens: true,
77
+ findUser: true,
78
+ findUserBeforeAuth: false,
79
+ findUserInAuthResultBy: {
80
+ userFieldName: 'email',
81
+ resultFieldName: 'idTokenPayload.email'
82
+ },
83
+ useReturnedTokens: true,
84
+ validWithoutUser: false
85
+ },
86
+ [AppConfigDomainIAMAuthenticationStep.Initiate]: {
87
+ cache: {
88
+ populate: {
89
+ data: [{ cacheFieldName: 'codeVerifier', inputFieldName: 'result.codeVerifier' }]
90
+ },
91
+ settings: {
92
+ cacheFieldName: 'state',
93
+ inputFieldName: 'result.state'
94
+ }
95
+ },
96
+ findUser: false,
97
+ stepResultPublicFields: ['authorizationCodeRequestURL'],
98
+ validWithoutUser: true
99
+ }
100
+ };
101
+ return ld.merge(defaultConfig, steps);
102
+ }
103
+
104
+ async initiate(
105
+ data: IAMAuthenticationOktaInitiateData,
106
+ options: IAMAuthenticationOktaInitiateOptions<InitiateContext>
107
+ ): Promise<IAMAuthenticationOktaInitiateResult> {
108
+ return super.initiate(data, {
109
+ ...options,
110
+ generateNonce: true,
111
+ withPCKE: true
112
+ }) as Promise<IAMAuthenticationOktaInitiateResult>;
113
+ }
114
+
115
+ // TODO: this
116
+ async refreshExternalAccessToken(
117
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
118
+ _data: IAMAuthenticationOktaRefreshExternalAccessTokenData
119
+ ): Promise<IAMAuthenticationOktaRefreshExternalAccessTokenResult> {
120
+ throw new ApplicationError(
121
+ `[${this.moduleName}][${this.serviceName}}]: Method "refreshExternalAccessToken" not implemented.`
122
+ );
123
+ }
124
+ }
@@ -0,0 +1,2 @@
1
+ export * from './iam.authenticationOkta.definitions';
2
+ export * from './iam.authenticationOkta.service';
@@ -0,0 +1 @@
1
+ export * from './authenticationOkta';
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["src"],
8
+ "exclude": ["node_modules", "dist", "src/**/*/*.spec.ts", "src/*.spec.ts", "src/vitest.config.ts"]
9
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["src"],
8
+ "exclude": ["node_modules", "dist"]
9
+ }