@clemax/nest-keycloak-connect 2.1.0 → 2.1.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.
- package/dist/constants.d.ts +69 -0
- package/dist/constants.js +76 -0
- package/dist/decorators/access-token.decorator.d.ts +5 -0
- package/dist/decorators/access-token.decorator.js +13 -0
- package/dist/decorators/enforcer-options.decorator.d.ts +8 -0
- package/dist/decorators/enforcer-options.decorator.js +12 -0
- package/dist/decorators/keycloak-user.decorator.d.ts +5 -0
- package/dist/decorators/keycloak-user.decorator.js +13 -0
- package/dist/decorators/public.decorator.d.ts +7 -0
- package/dist/decorators/public.decorator.js +12 -0
- package/dist/decorators/resource.decorator.d.ts +6 -0
- package/dist/decorators/resource.decorator.js +11 -0
- package/dist/decorators/roles.decorator.d.ts +10 -0
- package/dist/decorators/roles.decorator.js +15 -0
- package/dist/decorators/scopes.decorator.d.ts +19 -0
- package/dist/decorators/scopes.decorator.js +28 -0
- package/dist/guards/auth.guard.d.ts +19 -0
- package/dist/guards/auth.guard.js +172 -0
- package/dist/guards/resource.guard.d.ts +18 -0
- package/dist/guards/resource.guard.js +175 -0
- package/dist/guards/role.guard.d.ts +17 -0
- package/dist/guards/role.guard.js +139 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/interface/keycloak-connect-module-async-options.interface.d.ts +9 -0
- package/dist/interface/keycloak-connect-module-async-options.interface.js +2 -0
- package/dist/interface/keycloak-connect-options-factory.interface.d.ts +4 -0
- package/dist/interface/keycloak-connect-options-factory.interface.js +2 -0
- package/dist/interface/keycloak-connect-options.interface.d.ts +170 -0
- package/dist/interface/keycloak-connect-options.interface.js +3 -0
- package/dist/internal.util.d.ts +8 -0
- package/dist/internal.util.js +69 -0
- package/dist/keycloak-connect.module.d.ts +32 -0
- package/dist/keycloak-connect.module.js +126 -0
- package/dist/keycloak-connect.providers.d.ts +7 -0
- package/dist/keycloak-connect.providers.js +81 -0
- package/dist/services/keycloak-multitenant.service.d.ts +24 -0
- package/dist/services/keycloak-multitenant.service.js +174 -0
- package/dist/util.d.ts +1 -0
- package/dist/util.js +8 -0
- package/package.json +13 -11
|
@@ -0,0 +1,126 @@
|
|
|
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
14
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
15
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
17
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
18
|
+
};
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
22
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
23
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
24
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
25
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
26
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
27
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
28
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
var KeycloakConnectModule_1;
|
|
32
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
|
+
exports.KeycloakConnectModule = void 0;
|
|
34
|
+
const common_1 = require("@nestjs/common");
|
|
35
|
+
const constants_1 = require("./constants");
|
|
36
|
+
const keycloak_connect_providers_1 = require("./keycloak-connect.providers");
|
|
37
|
+
const keycloak_multitenant_service_1 = require("./services/keycloak-multitenant.service");
|
|
38
|
+
__exportStar(require("./constants"), exports);
|
|
39
|
+
__exportStar(require("./decorators/access-token.decorator"), exports);
|
|
40
|
+
__exportStar(require("./decorators/enforcer-options.decorator"), exports);
|
|
41
|
+
__exportStar(require("./decorators/keycloak-user.decorator"), exports);
|
|
42
|
+
__exportStar(require("./decorators/public.decorator"), exports);
|
|
43
|
+
__exportStar(require("./decorators/resource.decorator"), exports);
|
|
44
|
+
__exportStar(require("./decorators/roles.decorator"), exports);
|
|
45
|
+
__exportStar(require("./decorators/scopes.decorator"), exports);
|
|
46
|
+
__exportStar(require("./guards/auth.guard"), exports);
|
|
47
|
+
__exportStar(require("./guards/resource.guard"), exports);
|
|
48
|
+
__exportStar(require("./guards/role.guard"), exports);
|
|
49
|
+
__exportStar(require("./interface/keycloak-connect-module-async-options.interface"), exports);
|
|
50
|
+
__exportStar(require("./interface/keycloak-connect-options-factory.interface"), exports);
|
|
51
|
+
__exportStar(require("./interface/keycloak-connect-options.interface"), exports);
|
|
52
|
+
__exportStar(require("./services/keycloak-multitenant.service"), exports);
|
|
53
|
+
__exportStar(require("./util"), exports);
|
|
54
|
+
let KeycloakConnectModule = KeycloakConnectModule_1 = class KeycloakConnectModule {
|
|
55
|
+
/**
|
|
56
|
+
* Register the `KeycloakConnect` module.
|
|
57
|
+
* @param opts `keycloak.json` path in string or {@link NestKeycloakConfig} object.
|
|
58
|
+
* @param config {@link NestKeycloakConfig} when using `keycloak.json` path, optional
|
|
59
|
+
* @returns
|
|
60
|
+
*/
|
|
61
|
+
static register(opts, config) {
|
|
62
|
+
const keycloakConnectProviders = [
|
|
63
|
+
(0, keycloak_connect_providers_1.createKeycloakConnectOptionProvider)(opts, config),
|
|
64
|
+
keycloak_connect_providers_1.keycloakProvider,
|
|
65
|
+
keycloak_multitenant_service_1.KeycloakMultiTenantService,
|
|
66
|
+
{
|
|
67
|
+
provide: constants_1.KEYCLOAK_MULTITENANT_SERVICE,
|
|
68
|
+
useClass: keycloak_multitenant_service_1.KeycloakMultiTenantService,
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
return {
|
|
72
|
+
module: KeycloakConnectModule_1,
|
|
73
|
+
providers: keycloakConnectProviders,
|
|
74
|
+
exports: keycloakConnectProviders,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
static registerAsync(opts) {
|
|
78
|
+
const optsProvider = this.createAsyncProviders(opts);
|
|
79
|
+
return {
|
|
80
|
+
module: KeycloakConnectModule_1,
|
|
81
|
+
imports: opts.imports || [],
|
|
82
|
+
providers: optsProvider,
|
|
83
|
+
exports: optsProvider,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
static createAsyncProviders(options) {
|
|
87
|
+
const reqProviders = [
|
|
88
|
+
this.createAsyncOptionsProvider(options),
|
|
89
|
+
keycloak_connect_providers_1.keycloakProvider,
|
|
90
|
+
keycloak_multitenant_service_1.KeycloakMultiTenantService,
|
|
91
|
+
{
|
|
92
|
+
provide: constants_1.KEYCLOAK_MULTITENANT_SERVICE,
|
|
93
|
+
useClass: keycloak_multitenant_service_1.KeycloakMultiTenantService,
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
if (options.useExisting || options.useFactory) {
|
|
97
|
+
return reqProviders;
|
|
98
|
+
}
|
|
99
|
+
return [
|
|
100
|
+
...reqProviders,
|
|
101
|
+
{
|
|
102
|
+
provide: options.useClass,
|
|
103
|
+
useClass: options.useClass,
|
|
104
|
+
},
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
static createAsyncOptionsProvider(options) {
|
|
108
|
+
if (options.useFactory) {
|
|
109
|
+
return {
|
|
110
|
+
provide: constants_1.KEYCLOAK_CONNECT_OPTIONS,
|
|
111
|
+
useFactory: options.useFactory,
|
|
112
|
+
inject: options.inject || [],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
provide: constants_1.KEYCLOAK_CONNECT_OPTIONS,
|
|
117
|
+
useFactory: (optionsFactory) => __awaiter(this, void 0, void 0, function* () { return yield optionsFactory.createKeycloakConnectOptions(); }),
|
|
118
|
+
inject: [options.useExisting || options.useClass],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
exports.KeycloakConnectModule = KeycloakConnectModule;
|
|
123
|
+
KeycloakConnectModule.logger = new common_1.Logger(KeycloakConnectModule_1.name);
|
|
124
|
+
exports.KeycloakConnectModule = KeycloakConnectModule = KeycloakConnectModule_1 = __decorate([
|
|
125
|
+
(0, common_1.Module)({})
|
|
126
|
+
], KeycloakConnectModule);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Provider } from '@nestjs/common';
|
|
2
|
+
import { KeycloakConnectConfig, KeycloakConnectOptions, NestKeycloakConfig } from './interface/keycloak-connect-options.interface';
|
|
3
|
+
export declare const keycloakProvider: Provider;
|
|
4
|
+
export declare const createKeycloakConnectOptionProvider: (opts: KeycloakConnectOptions, config?: NestKeycloakConfig) => {
|
|
5
|
+
provide: string;
|
|
6
|
+
useValue: KeycloakConnectConfig;
|
|
7
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.createKeycloakConnectOptionProvider = exports.keycloakProvider = void 0;
|
|
30
|
+
const fs = __importStar(require("fs"));
|
|
31
|
+
const keycloak_connect_1 = __importDefault(require("keycloak-connect"));
|
|
32
|
+
const path = __importStar(require("path"));
|
|
33
|
+
const constants_1 = require("./constants");
|
|
34
|
+
const keycloak_connect_module_1 = require("./keycloak-connect.module");
|
|
35
|
+
exports.keycloakProvider = {
|
|
36
|
+
provide: constants_1.KEYCLOAK_INSTANCE,
|
|
37
|
+
useFactory: (opts) => {
|
|
38
|
+
const keycloakOpts = opts;
|
|
39
|
+
const keycloak = new keycloak_connect_1.default({}, keycloakOpts);
|
|
40
|
+
// Warn if using token validation none
|
|
41
|
+
if (typeof opts !== 'string' &&
|
|
42
|
+
opts.tokenValidation &&
|
|
43
|
+
opts.tokenValidation === constants_1.TokenValidation.NONE) {
|
|
44
|
+
keycloak_connect_module_1.KeycloakConnectModule.logger.warn(`Token validation is disabled, please only do this on development/special use-cases.`);
|
|
45
|
+
}
|
|
46
|
+
// Access denied is called, add a flag to request so our resource guard knows
|
|
47
|
+
keycloak.accessDenied = (req, res, next) => {
|
|
48
|
+
req.resourceDenied = true;
|
|
49
|
+
next();
|
|
50
|
+
};
|
|
51
|
+
return keycloak;
|
|
52
|
+
},
|
|
53
|
+
inject: [constants_1.KEYCLOAK_CONNECT_OPTIONS],
|
|
54
|
+
};
|
|
55
|
+
const parseConfig = (opts, config) => {
|
|
56
|
+
if (typeof opts === 'string') {
|
|
57
|
+
const configPathRelative = path.join(__dirname, opts);
|
|
58
|
+
const configPathRoot = path.join(process.cwd(), opts);
|
|
59
|
+
let configPath;
|
|
60
|
+
if (fs.existsSync(configPathRelative)) {
|
|
61
|
+
configPath = configPathRelative;
|
|
62
|
+
}
|
|
63
|
+
else if (fs.existsSync(configPathRoot)) {
|
|
64
|
+
configPath = configPathRoot;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw new Error(`Cannot find files, looked in [ ${configPathRelative}, ${configPathRoot} ]`);
|
|
68
|
+
}
|
|
69
|
+
const json = fs.readFileSync(configPath);
|
|
70
|
+
const keycloakConfig = JSON.parse(json.toString());
|
|
71
|
+
return Object.assign(keycloakConfig, config);
|
|
72
|
+
}
|
|
73
|
+
return opts;
|
|
74
|
+
};
|
|
75
|
+
const createKeycloakConnectOptionProvider = (opts, config) => {
|
|
76
|
+
return {
|
|
77
|
+
provide: constants_1.KEYCLOAK_CONNECT_OPTIONS,
|
|
78
|
+
useValue: parseConfig(opts, config),
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
exports.createKeycloakConnectOptionProvider = createKeycloakConnectOptionProvider;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import KeycloakConnect from 'keycloak-connect';
|
|
2
|
+
import { KeycloakConnectOptions } from '../interface/keycloak-connect-options.interface';
|
|
3
|
+
/**
|
|
4
|
+
* Stores all keycloak instances when multi tenant option is defined.
|
|
5
|
+
*/
|
|
6
|
+
export declare class KeycloakMultiTenantService {
|
|
7
|
+
private keycloakOpts;
|
|
8
|
+
private instances;
|
|
9
|
+
constructor(keycloakOpts: KeycloakConnectOptions);
|
|
10
|
+
/**
|
|
11
|
+
* Clears the cached Keycloak instances.
|
|
12
|
+
*/
|
|
13
|
+
clear(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Retrieves a keycloak instance based on the realm provided.
|
|
16
|
+
* @param realm the realm to retrieve from
|
|
17
|
+
* @param request the request instance, defaults to undefined
|
|
18
|
+
* @returns the multi tenant keycloak instance
|
|
19
|
+
*/
|
|
20
|
+
get(realm: string, request?: any): Promise<KeycloakConnect.Keycloak>;
|
|
21
|
+
resolveAuthServerUrl(realm: string, request?: any): Promise<string>;
|
|
22
|
+
resolveClientId(realm: string, request?: any): Promise<string>;
|
|
23
|
+
resolveSecret(realm: string, request?: any): Promise<string>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
15
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
16
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
17
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
18
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
19
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
20
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
24
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.KeycloakMultiTenantService = void 0;
|
|
28
|
+
const common_1 = require("@nestjs/common");
|
|
29
|
+
const keycloak_connect_1 = __importDefault(require("keycloak-connect"));
|
|
30
|
+
const constants_1 = require("../constants");
|
|
31
|
+
/**
|
|
32
|
+
* Stores all keycloak instances when multi tenant option is defined.
|
|
33
|
+
*/
|
|
34
|
+
let KeycloakMultiTenantService = class KeycloakMultiTenantService {
|
|
35
|
+
constructor(keycloakOpts) {
|
|
36
|
+
this.keycloakOpts = keycloakOpts;
|
|
37
|
+
this.instances = new Map();
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Clears the cached Keycloak instances.
|
|
41
|
+
*/
|
|
42
|
+
clear() {
|
|
43
|
+
this.instances.clear();
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Retrieves a keycloak instance based on the realm provided.
|
|
47
|
+
* @param realm the realm to retrieve from
|
|
48
|
+
* @param request the request instance, defaults to undefined
|
|
49
|
+
* @returns the multi tenant keycloak instance
|
|
50
|
+
*/
|
|
51
|
+
get(realm_1) {
|
|
52
|
+
return __awaiter(this, arguments, void 0, function* (realm, request = undefined) {
|
|
53
|
+
if (typeof this.keycloakOpts === 'string') {
|
|
54
|
+
throw new Error('Keycloak configuration is a configuration path. This should not happen after module load.');
|
|
55
|
+
}
|
|
56
|
+
if (this.keycloakOpts.multiTenant === null ||
|
|
57
|
+
this.keycloakOpts.multiTenant === undefined) {
|
|
58
|
+
throw new Error('Multi tenant is not defined yet multi tenant service is being called.');
|
|
59
|
+
}
|
|
60
|
+
const authServerUrl = yield this.resolveAuthServerUrl(realm, request);
|
|
61
|
+
const secret = yield this.resolveSecret(realm, request);
|
|
62
|
+
const clientId = yield this.resolveClientId(realm, request);
|
|
63
|
+
// Check if existing
|
|
64
|
+
if (this.instances.has(realm) &&
|
|
65
|
+
!this.keycloakOpts.multiTenant.resolveAlways) {
|
|
66
|
+
// Otherwise return the instance
|
|
67
|
+
return this.instances.get(realm);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
// TODO: Repeating code from provider, will need to rework this in 2.0
|
|
71
|
+
// Override realm, secret, and authServerUrl
|
|
72
|
+
const keycloakOpts = Object.assign(this.keycloakOpts, {
|
|
73
|
+
authServerUrl,
|
|
74
|
+
realm,
|
|
75
|
+
secret,
|
|
76
|
+
clientId,
|
|
77
|
+
});
|
|
78
|
+
const keycloak = new keycloak_connect_1.default({}, keycloakOpts);
|
|
79
|
+
// The most important part
|
|
80
|
+
keycloak.accessDenied = (req, res, next) => {
|
|
81
|
+
req.resourceDenied = true;
|
|
82
|
+
next();
|
|
83
|
+
};
|
|
84
|
+
// Save instance
|
|
85
|
+
this.instances.set(realm, keycloak);
|
|
86
|
+
return keycloak;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
resolveAuthServerUrl(realm_1) {
|
|
91
|
+
return __awaiter(this, arguments, void 0, function* (realm, request = undefined) {
|
|
92
|
+
if (typeof this.keycloakOpts === 'string') {
|
|
93
|
+
throw new Error('Keycloak configuration is a configuration path. This should not happen after module load.');
|
|
94
|
+
}
|
|
95
|
+
if (this.keycloakOpts.multiTenant === null ||
|
|
96
|
+
this.keycloakOpts.multiTenant === undefined) {
|
|
97
|
+
throw new Error('Multi tenant is not defined yet multi tenant service is being called.');
|
|
98
|
+
}
|
|
99
|
+
// If no realm auth server url resolver is defined, return defaults
|
|
100
|
+
if (!this.keycloakOpts.multiTenant.realmAuthServerUrlResolver) {
|
|
101
|
+
return (this.keycloakOpts.authServerUrl ||
|
|
102
|
+
this.keycloakOpts['auth-server-url'] ||
|
|
103
|
+
this.keycloakOpts.serverUrl ||
|
|
104
|
+
this.keycloakOpts['server-url']);
|
|
105
|
+
}
|
|
106
|
+
// Resolve realm authServerUrl
|
|
107
|
+
const resolvedAuthServerUrl = this.keycloakOpts.multiTenant.realmAuthServerUrlResolver(realm, request);
|
|
108
|
+
const authServerUrl = resolvedAuthServerUrl || resolvedAuthServerUrl instanceof Promise
|
|
109
|
+
? yield resolvedAuthServerUrl
|
|
110
|
+
: resolvedAuthServerUrl;
|
|
111
|
+
// Override auth server url
|
|
112
|
+
// Order of priority: resolved realm auth server url > provided auth server url
|
|
113
|
+
return (authServerUrl ||
|
|
114
|
+
this.keycloakOpts.authServerUrl ||
|
|
115
|
+
this.keycloakOpts['auth-server-url'] ||
|
|
116
|
+
this.keycloakOpts.serverUrl ||
|
|
117
|
+
this.keycloakOpts['server-url']);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
resolveClientId(realm_1) {
|
|
121
|
+
return __awaiter(this, arguments, void 0, function* (realm, request = undefined) {
|
|
122
|
+
if (typeof this.keycloakOpts === 'string') {
|
|
123
|
+
throw new Error('Keycloak configuration is a configuration path. This should not happen after module load.');
|
|
124
|
+
}
|
|
125
|
+
if (this.keycloakOpts.multiTenant === null ||
|
|
126
|
+
this.keycloakOpts.multiTenant === undefined) {
|
|
127
|
+
throw new Error('Multi tenant is not defined yet multi tenant service is being called.');
|
|
128
|
+
}
|
|
129
|
+
// If no realm client-id resolver is defined, return defaults
|
|
130
|
+
if (!this.keycloakOpts.multiTenant.realmClientIdResolver) {
|
|
131
|
+
return this.keycloakOpts.clientId || this.keycloakOpts['client-id'];
|
|
132
|
+
}
|
|
133
|
+
// Resolve realm client-id
|
|
134
|
+
const resolvedClientId = this.keycloakOpts.multiTenant.realmClientIdResolver(realm, request);
|
|
135
|
+
const realmClientId = resolvedClientId || resolvedClientId instanceof Promise
|
|
136
|
+
? yield resolvedClientId
|
|
137
|
+
: resolvedClientId;
|
|
138
|
+
// Override client-id
|
|
139
|
+
// Order of priority: resolved realm secret > default global secret
|
|
140
|
+
return (realmClientId ||
|
|
141
|
+
this.keycloakOpts.clientId ||
|
|
142
|
+
this.keycloakOpts['client-id']);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
resolveSecret(realm_1) {
|
|
146
|
+
return __awaiter(this, arguments, void 0, function* (realm, request = undefined) {
|
|
147
|
+
if (typeof this.keycloakOpts === 'string') {
|
|
148
|
+
throw new Error('Keycloak configuration is a configuration path. This should not happen after module load.');
|
|
149
|
+
}
|
|
150
|
+
if (this.keycloakOpts.multiTenant === null ||
|
|
151
|
+
this.keycloakOpts.multiTenant === undefined) {
|
|
152
|
+
throw new Error('Multi tenant is not defined yet multi tenant service is being called.');
|
|
153
|
+
}
|
|
154
|
+
// If no realm secret resolver is defined, return defaults
|
|
155
|
+
if (!this.keycloakOpts.multiTenant.realmSecretResolver) {
|
|
156
|
+
return this.keycloakOpts.secret;
|
|
157
|
+
}
|
|
158
|
+
// Resolve realm secret
|
|
159
|
+
const resolvedRealmSecret = this.keycloakOpts.multiTenant.realmSecretResolver(realm, request);
|
|
160
|
+
const realmSecret = resolvedRealmSecret || resolvedRealmSecret instanceof Promise
|
|
161
|
+
? yield resolvedRealmSecret
|
|
162
|
+
: resolvedRealmSecret;
|
|
163
|
+
// Override secret
|
|
164
|
+
// Order of priority: resolved realm secret > default global secret
|
|
165
|
+
return realmSecret || this.keycloakOpts.secret;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
exports.KeycloakMultiTenantService = KeycloakMultiTenantService;
|
|
170
|
+
exports.KeycloakMultiTenantService = KeycloakMultiTenantService = __decorate([
|
|
171
|
+
(0, common_1.Injectable)(),
|
|
172
|
+
__param(0, (0, common_1.Inject)(constants_1.KEYCLOAK_CONNECT_OPTIONS)),
|
|
173
|
+
__metadata("design:paramtypes", [Object])
|
|
174
|
+
], KeycloakMultiTenantService);
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const parseToken: (token: string) => any;
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseToken = void 0;
|
|
4
|
+
const parseToken = (token) => {
|
|
5
|
+
const parts = token.split('.');
|
|
6
|
+
return JSON.parse(Buffer.from(parts[1], 'base64').toString());
|
|
7
|
+
};
|
|
8
|
+
exports.parseToken = parseToken;
|
package/package.json
CHANGED
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clemax/nest-keycloak-connect",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "keycloak-nodejs-connect module for Nest",
|
|
5
5
|
"author": "John Joshua Ferrer <johnjoshuaferrer@disroot.org>",
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"start:dev": "tsc -w",
|
|
9
|
+
"clean": "rimraf dist",
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"release": "release-it",
|
|
12
|
+
"release:alpha": "release-it --preReleaseId=alpha --npm.tag=next --github.preRelease",
|
|
13
|
+
"format": "prettier src --write",
|
|
14
|
+
"lint": "eslint src",
|
|
15
|
+
"prepare": "husky"
|
|
16
|
+
},
|
|
7
17
|
"keywords": [
|
|
8
18
|
"nestjs",
|
|
9
19
|
"keycloak",
|
|
@@ -88,13 +98,5 @@
|
|
|
88
98
|
"eslint"
|
|
89
99
|
]
|
|
90
100
|
},
|
|
91
|
-
"
|
|
92
|
-
|
|
93
|
-
"clean": "rimraf dist",
|
|
94
|
-
"build": "tsc",
|
|
95
|
-
"release": "release-it",
|
|
96
|
-
"release:alpha": "release-it --preReleaseId=alpha --npm.tag=next --github.preRelease",
|
|
97
|
-
"format": "prettier src --write",
|
|
98
|
-
"lint": "eslint src"
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
+
"packageManager": "pnpm@9.1.0-0+sha512.568e95e38592215a03fa2cb02a58b67c6452e51b176d9941d546a59a471c42e2b4c2428bf286addcbe4e2dec98e682e2df0fa93a5082cf3493afc496affd8ffb"
|
|
102
|
+
}
|