@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 +1 -0
- package/README.md +4 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/services/authenticationOkta/iam.authenticationOkta.definitions.d.ts +23 -0
- package/dist/services/authenticationOkta/iam.authenticationOkta.definitions.js +3 -0
- package/dist/services/authenticationOkta/iam.authenticationOkta.definitions.js.map +1 -0
- package/dist/services/authenticationOkta/iam.authenticationOkta.service.d.ts +14 -0
- package/dist/services/authenticationOkta/iam.authenticationOkta.service.js +103 -0
- package/dist/services/authenticationOkta/iam.authenticationOkta.service.js.map +1 -0
- package/dist/services/authenticationOkta/index.d.ts +2 -0
- package/dist/services/authenticationOkta/index.js +19 -0
- package/dist/services/authenticationOkta/index.js.map +1 -0
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/package.json +21 -0
- package/src/index.ts +1 -0
- package/src/services/authenticationOkta/iam.authenticationOkta.definitions.ts +52 -0
- package/src/services/authenticationOkta/iam.authenticationOkta.service.ts +124 -0
- package/src/services/authenticationOkta/index.ts +2 -0
- package/src/services/index.ts +1 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.json +9 -0
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).
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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,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 @@
|
|
|
1
|
+
export * from './authenticationOkta';
|