@pawells/nestjs-auth 1.0.0-dev.3052c75
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 +21 -0
- package/README.md +602 -0
- package/build/LICENSE +21 -0
- package/build/README.md +602 -0
- package/build/admin/client/client.d.ts +82 -0
- package/build/admin/client/client.d.ts.map +1 -0
- package/build/admin/client/client.js +157 -0
- package/build/admin/client/client.js.map +1 -0
- package/build/admin/client/errors/base-error.d.ts +58 -0
- package/build/admin/client/errors/base-error.d.ts.map +1 -0
- package/build/admin/client/errors/base-error.js +100 -0
- package/build/admin/client/errors/base-error.js.map +1 -0
- package/build/admin/client/errors/index.d.ts +2 -0
- package/build/admin/client/errors/index.d.ts.map +1 -0
- package/build/admin/client/errors/index.js +2 -0
- package/build/admin/client/errors/index.js.map +1 -0
- package/build/admin/client/index.d.ts +6 -0
- package/build/admin/client/index.d.ts.map +1 -0
- package/build/admin/client/index.js +11 -0
- package/build/admin/client/index.js.map +1 -0
- package/build/admin/client/services/authentication.service.d.ts +54 -0
- package/build/admin/client/services/authentication.service.d.ts.map +1 -0
- package/build/admin/client/services/authentication.service.js +99 -0
- package/build/admin/client/services/authentication.service.js.map +1 -0
- package/build/admin/client/services/base-service.d.ts +39 -0
- package/build/admin/client/services/base-service.d.ts.map +1 -0
- package/build/admin/client/services/base-service.js +107 -0
- package/build/admin/client/services/base-service.js.map +1 -0
- package/build/admin/client/services/client.service.d.ts +86 -0
- package/build/admin/client/services/client.service.d.ts.map +1 -0
- package/build/admin/client/services/client.service.js +193 -0
- package/build/admin/client/services/client.service.js.map +1 -0
- package/build/admin/client/services/event.service.d.ts +84 -0
- package/build/admin/client/services/event.service.d.ts.map +1 -0
- package/build/admin/client/services/event.service.js +155 -0
- package/build/admin/client/services/event.service.js.map +1 -0
- package/build/admin/client/services/federated-identity.service.d.ts +89 -0
- package/build/admin/client/services/federated-identity.service.d.ts.map +1 -0
- package/build/admin/client/services/federated-identity.service.js +120 -0
- package/build/admin/client/services/federated-identity.service.js.map +1 -0
- package/build/admin/client/services/group.service.d.ts +52 -0
- package/build/admin/client/services/group.service.d.ts.map +1 -0
- package/build/admin/client/services/group.service.js +105 -0
- package/build/admin/client/services/group.service.js.map +1 -0
- package/build/admin/client/services/identity-provider.service.d.ts +47 -0
- package/build/admin/client/services/identity-provider.service.d.ts.map +1 -0
- package/build/admin/client/services/identity-provider.service.js +86 -0
- package/build/admin/client/services/identity-provider.service.js.map +1 -0
- package/build/admin/client/services/index.d.ts +11 -0
- package/build/admin/client/services/index.d.ts.map +1 -0
- package/build/admin/client/services/index.js +11 -0
- package/build/admin/client/services/index.js.map +1 -0
- package/build/admin/client/services/realm.service.d.ts +41 -0
- package/build/admin/client/services/realm.service.d.ts.map +1 -0
- package/build/admin/client/services/realm.service.js +80 -0
- package/build/admin/client/services/realm.service.js.map +1 -0
- package/build/admin/client/services/role.service.d.ts +45 -0
- package/build/admin/client/services/role.service.d.ts.map +1 -0
- package/build/admin/client/services/role.service.js +92 -0
- package/build/admin/client/services/role.service.js.map +1 -0
- package/build/admin/client/services/user.service.d.ts +84 -0
- package/build/admin/client/services/user.service.d.ts.map +1 -0
- package/build/admin/client/services/user.service.js +216 -0
- package/build/admin/client/services/user.service.js.map +1 -0
- package/build/admin/client/types/config.types.d.ts +59 -0
- package/build/admin/client/types/config.types.d.ts.map +1 -0
- package/build/admin/client/types/config.types.js +13 -0
- package/build/admin/client/types/config.types.js.map +1 -0
- package/build/admin/client/types/event.types.d.ts +176 -0
- package/build/admin/client/types/event.types.d.ts.map +1 -0
- package/build/admin/client/types/event.types.js +2 -0
- package/build/admin/client/types/event.types.js.map +1 -0
- package/build/admin/client/types/index.d.ts +4 -0
- package/build/admin/client/types/index.d.ts.map +1 -0
- package/build/admin/client/types/index.js +4 -0
- package/build/admin/client/types/index.js.map +1 -0
- package/build/admin/client/types/keycloak.types.d.ts +169 -0
- package/build/admin/client/types/keycloak.types.d.ts.map +1 -0
- package/build/admin/client/types/keycloak.types.js +2 -0
- package/build/admin/client/types/keycloak.types.js.map +1 -0
- package/build/admin/client/utils/index.d.ts +2 -0
- package/build/admin/client/utils/index.d.ts.map +1 -0
- package/build/admin/client/utils/index.js +2 -0
- package/build/admin/client/utils/index.js.map +1 -0
- package/build/admin/client/utils/retry.d.ts +40 -0
- package/build/admin/client/utils/retry.d.ts.map +1 -0
- package/build/admin/client/utils/retry.js +72 -0
- package/build/admin/client/utils/retry.js.map +1 -0
- package/build/admin/config/keycloak.config.d.ts +33 -0
- package/build/admin/config/keycloak.config.d.ts.map +1 -0
- package/build/admin/config/keycloak.config.js +2 -0
- package/build/admin/config/keycloak.config.js.map +1 -0
- package/build/admin/config/keycloak.defaults.d.ts +11 -0
- package/build/admin/config/keycloak.defaults.d.ts.map +1 -0
- package/build/admin/config/keycloak.defaults.js +60 -0
- package/build/admin/config/keycloak.defaults.js.map +1 -0
- package/build/admin/health/keycloak.health.d.ts +13 -0
- package/build/admin/health/keycloak.health.d.ts.map +1 -0
- package/build/admin/health/keycloak.health.js +54 -0
- package/build/admin/health/keycloak.health.js.map +1 -0
- package/build/admin/index.d.ts +10 -0
- package/build/admin/index.d.ts.map +1 -0
- package/build/admin/index.js +9 -0
- package/build/admin/index.js.map +1 -0
- package/build/admin/keycloak-admin.interfaces.d.ts +45 -0
- package/build/admin/keycloak-admin.interfaces.d.ts.map +1 -0
- package/build/admin/keycloak-admin.interfaces.js +2 -0
- package/build/admin/keycloak-admin.interfaces.js.map +1 -0
- package/build/admin/keycloak-admin.module.d.ts +23 -0
- package/build/admin/keycloak-admin.module.d.ts.map +1 -0
- package/build/admin/keycloak-admin.module.js +101 -0
- package/build/admin/keycloak-admin.module.js.map +1 -0
- package/build/admin/keycloak.constants.d.ts +16 -0
- package/build/admin/keycloak.constants.d.ts.map +1 -0
- package/build/admin/keycloak.constants.js +16 -0
- package/build/admin/keycloak.constants.js.map +1 -0
- package/build/admin/permissions/index.d.ts +2 -0
- package/build/admin/permissions/index.d.ts.map +1 -0
- package/build/admin/permissions/index.js +2 -0
- package/build/admin/permissions/index.js.map +1 -0
- package/build/admin/permissions/keycloak-admin.permissions.d.ts +45 -0
- package/build/admin/permissions/keycloak-admin.permissions.d.ts.map +1 -0
- package/build/admin/permissions/keycloak-admin.permissions.js +68 -0
- package/build/admin/permissions/keycloak-admin.permissions.js.map +1 -0
- package/build/admin/services/keycloak-admin.service.d.ts +64 -0
- package/build/admin/services/keycloak-admin.service.d.ts.map +1 -0
- package/build/admin/services/keycloak-admin.service.js +152 -0
- package/build/admin/services/keycloak-admin.service.js.map +1 -0
- package/build/decorators/auth-decorators.d.ts +217 -0
- package/build/decorators/auth-decorators.d.ts.map +1 -0
- package/build/decorators/auth-decorators.js +251 -0
- package/build/decorators/auth-decorators.js.map +1 -0
- package/build/decorators/context-utils.d.ts +101 -0
- package/build/decorators/context-utils.d.ts.map +1 -0
- package/build/decorators/context-utils.js +178 -0
- package/build/decorators/context-utils.js.map +1 -0
- package/build/decorators/graphql-auth-decorators.d.ts +144 -0
- package/build/decorators/graphql-auth-decorators.d.ts.map +1 -0
- package/build/decorators/graphql-auth-decorators.js +152 -0
- package/build/decorators/graphql-auth-decorators.js.map +1 -0
- package/build/decorators/index.d.ts +5 -0
- package/build/decorators/index.d.ts.map +1 -0
- package/build/decorators/index.js +4 -0
- package/build/decorators/index.js.map +1 -0
- package/build/guards/index.d.ts +4 -0
- package/build/guards/index.d.ts.map +1 -0
- package/build/guards/index.js +4 -0
- package/build/guards/index.js.map +1 -0
- package/build/guards/jwt-auth.guard.d.ts +52 -0
- package/build/guards/jwt-auth.guard.d.ts.map +1 -0
- package/build/guards/jwt-auth.guard.js +97 -0
- package/build/guards/jwt-auth.guard.js.map +1 -0
- package/build/guards/permission.guard.d.ts +37 -0
- package/build/guards/permission.guard.d.ts.map +1 -0
- package/build/guards/permission.guard.js +73 -0
- package/build/guards/permission.guard.js.map +1 -0
- package/build/guards/role.guard.d.ts +33 -0
- package/build/guards/role.guard.d.ts.map +1 -0
- package/build/guards/role.guard.js +69 -0
- package/build/guards/role.guard.js.map +1 -0
- package/build/index.d.ts +92 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +98 -0
- package/build/index.js.map +1 -0
- package/build/keycloak/index.d.ts +7 -0
- package/build/keycloak/index.d.ts.map +1 -0
- package/build/keycloak/index.js +5 -0
- package/build/keycloak/index.js.map +1 -0
- package/build/keycloak/keycloak.constants.d.ts +2 -0
- package/build/keycloak/keycloak.constants.d.ts.map +1 -0
- package/build/keycloak/keycloak.constants.js +2 -0
- package/build/keycloak/keycloak.constants.js.map +1 -0
- package/build/keycloak/keycloak.interfaces.d.ts +12 -0
- package/build/keycloak/keycloak.interfaces.d.ts.map +1 -0
- package/build/keycloak/keycloak.interfaces.js +2 -0
- package/build/keycloak/keycloak.interfaces.js.map +1 -0
- package/build/keycloak/keycloak.module.d.ts +56 -0
- package/build/keycloak/keycloak.module.d.ts.map +1 -0
- package/build/keycloak/keycloak.module.js +104 -0
- package/build/keycloak/keycloak.module.js.map +1 -0
- package/build/keycloak/keycloak.types.d.ts +60 -0
- package/build/keycloak/keycloak.types.d.ts.map +1 -0
- package/build/keycloak/keycloak.types.js +2 -0
- package/build/keycloak/keycloak.types.js.map +1 -0
- package/build/keycloak/services/jwks-cache.service.d.ts +64 -0
- package/build/keycloak/services/jwks-cache.service.d.ts.map +1 -0
- package/build/keycloak/services/jwks-cache.service.js +176 -0
- package/build/keycloak/services/jwks-cache.service.js.map +1 -0
- package/build/keycloak/services/keycloak-token-validation.service.d.ts +88 -0
- package/build/keycloak/services/keycloak-token-validation.service.d.ts.map +1 -0
- package/build/keycloak/services/keycloak-token-validation.service.js +243 -0
- package/build/keycloak/services/keycloak-token-validation.service.js.map +1 -0
- package/build/package.json +72 -0
- package/package.json +93 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import KcAdminClient from '@keycloak/keycloak-admin-client';
|
|
3
|
+
import { isPasswordCredentials, isClientCredentials } from './types/index.js';
|
|
4
|
+
import { RealmService, UserService, ClientService, RoleService, GroupService, IdentityProviderService, AuthenticationService, FederatedIdentityService, EventService, } from './services/index.js';
|
|
5
|
+
// Short client identifier length (last N characters of UUID)
|
|
6
|
+
const CLIENT_ID_SHORT_LENGTH = 12;
|
|
7
|
+
/**
|
|
8
|
+
* Keycloak Admin API client
|
|
9
|
+
*/
|
|
10
|
+
export class KeycloakClient {
|
|
11
|
+
/**
|
|
12
|
+
* Unique identifier for this client instance
|
|
13
|
+
*/
|
|
14
|
+
ClientUUID;
|
|
15
|
+
/**
|
|
16
|
+
* Short client identifier (last 12 characters of UUID)
|
|
17
|
+
*/
|
|
18
|
+
ClientID;
|
|
19
|
+
/**
|
|
20
|
+
* Realm service for managing realms
|
|
21
|
+
*/
|
|
22
|
+
Realms;
|
|
23
|
+
/**
|
|
24
|
+
* User service for managing users
|
|
25
|
+
*/
|
|
26
|
+
Users;
|
|
27
|
+
/**
|
|
28
|
+
* Client service for managing OAuth/OIDC clients
|
|
29
|
+
*/
|
|
30
|
+
Clients;
|
|
31
|
+
/**
|
|
32
|
+
* Role service for managing roles
|
|
33
|
+
*/
|
|
34
|
+
Roles;
|
|
35
|
+
/**
|
|
36
|
+
* Group service for managing groups
|
|
37
|
+
*/
|
|
38
|
+
Groups;
|
|
39
|
+
/**
|
|
40
|
+
* Identity provider service
|
|
41
|
+
*/
|
|
42
|
+
IdentityProviders;
|
|
43
|
+
/**
|
|
44
|
+
* Authentication service for managing auth flows
|
|
45
|
+
*/
|
|
46
|
+
Authentication;
|
|
47
|
+
/**
|
|
48
|
+
* Federated identity service
|
|
49
|
+
*/
|
|
50
|
+
FederatedIdentities;
|
|
51
|
+
/**
|
|
52
|
+
* Event service for querying admin and access events
|
|
53
|
+
*/
|
|
54
|
+
Events;
|
|
55
|
+
/**
|
|
56
|
+
* Internal Keycloak admin client
|
|
57
|
+
*/
|
|
58
|
+
adminClient;
|
|
59
|
+
/**
|
|
60
|
+
* Client configuration
|
|
61
|
+
*/
|
|
62
|
+
config;
|
|
63
|
+
/**
|
|
64
|
+
* Create a new Keycloak client instance
|
|
65
|
+
*/
|
|
66
|
+
constructor(config, grantedScopes) {
|
|
67
|
+
this.config = {
|
|
68
|
+
realmName: 'master',
|
|
69
|
+
timeout: 30000,
|
|
70
|
+
...config,
|
|
71
|
+
};
|
|
72
|
+
// Generate client identifiers
|
|
73
|
+
this.ClientUUID = randomUUID();
|
|
74
|
+
this.ClientID = this.ClientUUID.slice(-CLIENT_ID_SHORT_LENGTH);
|
|
75
|
+
// Initialize admin client
|
|
76
|
+
this.adminClient = new KcAdminClient({
|
|
77
|
+
baseUrl: this.config.baseUrl,
|
|
78
|
+
...(this.config.realmName && { realmName: this.config.realmName }),
|
|
79
|
+
});
|
|
80
|
+
// Initialize services
|
|
81
|
+
const { logger, retry } = this.config;
|
|
82
|
+
this.Realms = new RealmService(this.adminClient, grantedScopes, logger, retry);
|
|
83
|
+
this.Users = new UserService(this.adminClient, grantedScopes, logger, retry);
|
|
84
|
+
this.Clients = new ClientService(this.adminClient, grantedScopes, logger, retry);
|
|
85
|
+
this.Roles = new RoleService(this.adminClient, grantedScopes, logger, retry);
|
|
86
|
+
this.Groups = new GroupService(this.adminClient, grantedScopes, logger, retry);
|
|
87
|
+
this.IdentityProviders = new IdentityProviderService(this.adminClient, grantedScopes, logger, retry);
|
|
88
|
+
this.Authentication = new AuthenticationService(this.adminClient, grantedScopes, logger, retry);
|
|
89
|
+
this.FederatedIdentities = new FederatedIdentityService(this.adminClient, grantedScopes, logger, retry);
|
|
90
|
+
this.Events = new EventService(this.adminClient, grantedScopes, logger, retry);
|
|
91
|
+
if (this.config.logger) {
|
|
92
|
+
this.config.logger.info('KeycloakClient initialized', {
|
|
93
|
+
clientId: this.ClientID,
|
|
94
|
+
baseUrl: this.config.baseUrl,
|
|
95
|
+
realm: this.config.realmName,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Authenticate with Keycloak admin API
|
|
101
|
+
* This must be called before making API requests
|
|
102
|
+
*/
|
|
103
|
+
async authenticate() {
|
|
104
|
+
try {
|
|
105
|
+
if (isPasswordCredentials(this.config.credentials)) {
|
|
106
|
+
await this.adminClient.auth({
|
|
107
|
+
username: this.config.credentials.username,
|
|
108
|
+
password: this.config.credentials.password,
|
|
109
|
+
grantType: 'password',
|
|
110
|
+
clientId: 'admin-cli',
|
|
111
|
+
});
|
|
112
|
+
if (this.config.logger) {
|
|
113
|
+
this.config.logger.info('Authenticated with Keycloak using password credentials', {
|
|
114
|
+
username: this.config.credentials.username,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (isClientCredentials(this.config.credentials)) {
|
|
119
|
+
await this.adminClient.auth({
|
|
120
|
+
grantType: 'client_credentials',
|
|
121
|
+
clientId: this.config.credentials.clientId,
|
|
122
|
+
clientSecret: this.config.credentials.clientSecret,
|
|
123
|
+
});
|
|
124
|
+
if (this.config.logger) {
|
|
125
|
+
this.config.logger.info('Authenticated with Keycloak using client credentials', {
|
|
126
|
+
clientId: this.config.credentials.clientId,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (this.config.logger) {
|
|
133
|
+
this.config.logger.error('Failed to authenticate with Keycloak', { error });
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if the client is authenticated
|
|
140
|
+
*/
|
|
141
|
+
isAuthenticated() {
|
|
142
|
+
return this.adminClient.accessToken !== undefined;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get the current access token
|
|
146
|
+
*/
|
|
147
|
+
getAccessToken() {
|
|
148
|
+
return this.adminClient.accessToken;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Set the access token manually (for use with external auth)
|
|
152
|
+
*/
|
|
153
|
+
setAccessToken(token) {
|
|
154
|
+
this.adminClient.setAccessToken(token);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/admin/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { BaseApplicationError } from '@pawells/nestjs-shared/common';
|
|
2
|
+
/**
|
|
3
|
+
* Base error class for Keycloak client errors
|
|
4
|
+
*/
|
|
5
|
+
export declare class KeycloakClientError extends BaseApplicationError {
|
|
6
|
+
readonly cause?: Error | undefined;
|
|
7
|
+
readonly response?: unknown;
|
|
8
|
+
constructor(message: string, statusCode?: number, response?: unknown, cause?: Error | undefined);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Authentication error - failed to authenticate with Keycloak
|
|
12
|
+
*/
|
|
13
|
+
export declare class AuthenticationError extends KeycloakClientError {
|
|
14
|
+
constructor(message: string, statusCode?: number, response?: unknown);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Authorization error - authenticated but not authorized for the operation
|
|
18
|
+
*/
|
|
19
|
+
export declare class AuthorizationError extends KeycloakClientError {
|
|
20
|
+
constructor(message: string, statusCode?: number, response?: unknown);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resource not found error
|
|
24
|
+
*/
|
|
25
|
+
export declare class NotFoundError extends KeycloakClientError {
|
|
26
|
+
constructor(message: string, response?: unknown);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validation error - invalid request data
|
|
30
|
+
*/
|
|
31
|
+
export declare class ValidationError extends KeycloakClientError {
|
|
32
|
+
constructor(message: string, response?: unknown);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Rate limit error - too many requests
|
|
36
|
+
*/
|
|
37
|
+
export declare class RateLimitError extends KeycloakClientError {
|
|
38
|
+
constructor(message: string, response?: unknown);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Timeout error - request took too long
|
|
42
|
+
*/
|
|
43
|
+
export declare class TimeoutError extends KeycloakClientError {
|
|
44
|
+
constructor(message: string);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Network error - connection failed
|
|
48
|
+
*/
|
|
49
|
+
export declare class NetworkError extends KeycloakClientError {
|
|
50
|
+
constructor(message: string, cause?: Error);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Conflict error - resource already exists or conflicting operation
|
|
54
|
+
*/
|
|
55
|
+
export declare class ConflictError extends KeycloakClientError {
|
|
56
|
+
constructor(message: string, response?: unknown);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=base-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-error.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/errors/base-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAWrE;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,oBAAoB;aAOlC,KAAK,CAAC,EAAE,KAAK;IANvC,SAAgB,QAAQ,CAAC,EAAE,OAAO,CAAC;gBAGlC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,OAAO,EACO,KAAK,CAAC,EAAE,KAAK,YAAA;CAWvC;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,mBAAmB;gBAC/C,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;CAIpE;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,mBAAmB;gBAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;CAIpE;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,mBAAmB;gBACzC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;CAI/C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,mBAAmB;gBAC3C,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;CAI/C;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,mBAAmB;gBAC1C,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;CAI/C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,mBAAmB;gBACxC,OAAO,EAAE,MAAM;CAI3B;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,mBAAmB;gBACxC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAI1C;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,mBAAmB;gBACzC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO;CAI/C"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { BaseApplicationError } from '@pawells/nestjs-shared/common';
|
|
2
|
+
const HTTP_STATUS_BAD_REQUEST = 400;
|
|
3
|
+
const HTTP_STATUS_UNAUTHORIZED = 401;
|
|
4
|
+
const HTTP_STATUS_FORBIDDEN = 403;
|
|
5
|
+
const HTTP_STATUS_NOT_FOUND = 404;
|
|
6
|
+
const HTTP_STATUS_REQUEST_TIMEOUT = 408;
|
|
7
|
+
const HTTP_STATUS_CONFLICT = 409;
|
|
8
|
+
const HTTP_STATUS_RATE_LIMIT = 429;
|
|
9
|
+
const HTTP_STATUS_INTERNAL_SERVER_ERROR = 500;
|
|
10
|
+
/**
|
|
11
|
+
* Base error class for Keycloak client errors
|
|
12
|
+
*/
|
|
13
|
+
export class KeycloakClientError extends BaseApplicationError {
|
|
14
|
+
cause;
|
|
15
|
+
response;
|
|
16
|
+
constructor(message, statusCode, response, cause) {
|
|
17
|
+
const errorCode = `KEYCLOAK_${statusCode ? 'HTTP_' + statusCode : 'CLIENT_ERROR'}`;
|
|
18
|
+
super(message, {
|
|
19
|
+
code: errorCode,
|
|
20
|
+
statusCode: statusCode ?? HTTP_STATUS_INTERNAL_SERVER_ERROR,
|
|
21
|
+
context: { response, cause },
|
|
22
|
+
});
|
|
23
|
+
this.cause = cause;
|
|
24
|
+
this.name = 'KeycloakClientError';
|
|
25
|
+
this.response = response;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Authentication error - failed to authenticate with Keycloak
|
|
30
|
+
*/
|
|
31
|
+
export class AuthenticationError extends KeycloakClientError {
|
|
32
|
+
constructor(message, statusCode, response) {
|
|
33
|
+
super(message, statusCode ?? HTTP_STATUS_UNAUTHORIZED, response);
|
|
34
|
+
this.name = 'AuthenticationError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Authorization error - authenticated but not authorized for the operation
|
|
39
|
+
*/
|
|
40
|
+
export class AuthorizationError extends KeycloakClientError {
|
|
41
|
+
constructor(message, statusCode, response) {
|
|
42
|
+
super(message, statusCode ?? HTTP_STATUS_FORBIDDEN, response);
|
|
43
|
+
this.name = 'AuthorizationError';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resource not found error
|
|
48
|
+
*/
|
|
49
|
+
export class NotFoundError extends KeycloakClientError {
|
|
50
|
+
constructor(message, response) {
|
|
51
|
+
super(message, HTTP_STATUS_NOT_FOUND, response);
|
|
52
|
+
this.name = 'NotFoundError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Validation error - invalid request data
|
|
57
|
+
*/
|
|
58
|
+
export class ValidationError extends KeycloakClientError {
|
|
59
|
+
constructor(message, response) {
|
|
60
|
+
super(message, HTTP_STATUS_BAD_REQUEST, response);
|
|
61
|
+
this.name = 'ValidationError';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Rate limit error - too many requests
|
|
66
|
+
*/
|
|
67
|
+
export class RateLimitError extends KeycloakClientError {
|
|
68
|
+
constructor(message, response) {
|
|
69
|
+
super(message, HTTP_STATUS_RATE_LIMIT, response);
|
|
70
|
+
this.name = 'RateLimitError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Timeout error - request took too long
|
|
75
|
+
*/
|
|
76
|
+
export class TimeoutError extends KeycloakClientError {
|
|
77
|
+
constructor(message) {
|
|
78
|
+
super(message, HTTP_STATUS_REQUEST_TIMEOUT);
|
|
79
|
+
this.name = 'TimeoutError';
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Network error - connection failed
|
|
84
|
+
*/
|
|
85
|
+
export class NetworkError extends KeycloakClientError {
|
|
86
|
+
constructor(message, cause) {
|
|
87
|
+
super(message, undefined, undefined, cause);
|
|
88
|
+
this.name = 'NetworkError';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Conflict error - resource already exists or conflicting operation
|
|
93
|
+
*/
|
|
94
|
+
export class ConflictError extends KeycloakClientError {
|
|
95
|
+
constructor(message, response) {
|
|
96
|
+
super(message, HTTP_STATUS_CONFLICT, response);
|
|
97
|
+
this.name = 'ConflictError';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=base-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-error.js","sourceRoot":"","sources":["../../../../src/admin/client/errors/base-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/admin/client/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/client/index.ts"],"names":[],"mappings":"AACA,cAAc,aAAa,CAAC;AAG5B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Main client
|
|
2
|
+
export * from './client.js';
|
|
3
|
+
// Services
|
|
4
|
+
export * from './services/index.js';
|
|
5
|
+
// Types
|
|
6
|
+
export * from './types/index.js';
|
|
7
|
+
// Errors
|
|
8
|
+
export * from './errors/index.js';
|
|
9
|
+
// Utils
|
|
10
|
+
export * from './utils/index.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/client/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,cAAc,aAAa,CAAC;AAE5B,WAAW;AACX,cAAc,qBAAqB,CAAC;AAEpC,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,SAAS;AACT,cAAc,mBAAmB,CAAC;AAElC,QAAQ;AACR,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { AuthenticationFlowRepresentation, AuthenticationExecutionInfoRepresentation } from '../types/index.js';
|
|
2
|
+
import { BaseService } from './base-service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Service for managing Keycloak authentication flows.
|
|
5
|
+
*
|
|
6
|
+
* Provides methods for querying and managing authentication flow configurations. Authentication flows
|
|
7
|
+
* define the steps users must complete to authenticate (e.g., username/password, MFA, social login).
|
|
8
|
+
* Flows can be customized by adding, removing, or reordering authenticators.
|
|
9
|
+
* Requires `authentication:read` and `authentication:write` scopes depending on the operation.
|
|
10
|
+
*
|
|
11
|
+
* Part of {@link KeycloakAdminService.authentication | KeycloakAdminService#authentication}.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const flows = await keycloak.authentication.getFlows('my-realm');
|
|
16
|
+
* const flow = await keycloak.authentication.getFlow('my-realm', 'flow-id');
|
|
17
|
+
* await keycloak.authentication.createFlow('my-realm', {
|
|
18
|
+
* alias: 'my-flow',
|
|
19
|
+
* description: 'Custom auth flow',
|
|
20
|
+
* builtIn: false,
|
|
21
|
+
* providerId: 'basic-flow',
|
|
22
|
+
* topLevel: true,
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export declare class AuthenticationService extends BaseService {
|
|
27
|
+
/**
|
|
28
|
+
* Get all authentication flows
|
|
29
|
+
*/
|
|
30
|
+
getFlows(realm: string): Promise<AuthenticationFlowRepresentation[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Get a specific authentication flow
|
|
33
|
+
*/
|
|
34
|
+
getFlow(realm: string, flowId: string): Promise<AuthenticationFlowRepresentation>;
|
|
35
|
+
/**
|
|
36
|
+
* Create an authentication flow
|
|
37
|
+
*/
|
|
38
|
+
createFlow(realm: string, flow: AuthenticationFlowRepresentation): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Delete an authentication flow
|
|
41
|
+
*/
|
|
42
|
+
deleteFlow(realm: string, flowId: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Get executions for a flow
|
|
45
|
+
*/
|
|
46
|
+
getExecutions(realm: string, flowAlias: string): Promise<AuthenticationExecutionInfoRepresentation[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Add an execution to a flow
|
|
49
|
+
*/
|
|
50
|
+
createExecution(realm: string, flowAlias: string, execution: {
|
|
51
|
+
provider: string;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=authentication.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.service.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/services/authentication.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gCAAgC,EAChC,yCAAyC,EACzC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,qBAAsB,SAAQ,WAAW;IACrD;;OAEG;IACU,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,EAAE,CAAC;IAWjF;;OAEG;IACU,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gCAAgC,CAAC;IAW9F;;OAEG;IACU,UAAU,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,gCAAgC,GACpC,OAAO,CAAC,IAAI,CAAC;IAWhB;;OAEG;IACU,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrE;;OAEG;IACU,aAAa,CACzB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,yCAAyC,EAAE,CAAC;IAWvD;;OAEG;IACU,eAAe,CAC3B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAC7B,OAAO,CAAC,IAAI,CAAC;CAahB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { BaseService } from './base-service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Service for managing Keycloak authentication flows.
|
|
4
|
+
*
|
|
5
|
+
* Provides methods for querying and managing authentication flow configurations. Authentication flows
|
|
6
|
+
* define the steps users must complete to authenticate (e.g., username/password, MFA, social login).
|
|
7
|
+
* Flows can be customized by adding, removing, or reordering authenticators.
|
|
8
|
+
* Requires `authentication:read` and `authentication:write` scopes depending on the operation.
|
|
9
|
+
*
|
|
10
|
+
* Part of {@link KeycloakAdminService.authentication | KeycloakAdminService#authentication}.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const flows = await keycloak.authentication.getFlows('my-realm');
|
|
15
|
+
* const flow = await keycloak.authentication.getFlow('my-realm', 'flow-id');
|
|
16
|
+
* await keycloak.authentication.createFlow('my-realm', {
|
|
17
|
+
* alias: 'my-flow',
|
|
18
|
+
* description: 'Custom auth flow',
|
|
19
|
+
* builtIn: false,
|
|
20
|
+
* providerId: 'basic-flow',
|
|
21
|
+
* topLevel: true,
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class AuthenticationService extends BaseService {
|
|
26
|
+
/**
|
|
27
|
+
* Get all authentication flows
|
|
28
|
+
*/
|
|
29
|
+
async getFlows(realm) {
|
|
30
|
+
this.requireScope('authentication:read');
|
|
31
|
+
try {
|
|
32
|
+
return (await this.withRetry(() => this.adminClient.authenticationManagement.getFlows({ realm })));
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return this.handleError(error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get a specific authentication flow
|
|
40
|
+
*/
|
|
41
|
+
async getFlow(realm, flowId) {
|
|
42
|
+
this.requireScope('authentication:read');
|
|
43
|
+
try {
|
|
44
|
+
return (await this.withRetry(() => this.adminClient.authenticationManagement.getFlow({ realm, flowId })));
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
return this.handleError(error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Create an authentication flow
|
|
52
|
+
*/
|
|
53
|
+
async createFlow(realm, flow) {
|
|
54
|
+
this.requireScope('authentication:write');
|
|
55
|
+
try {
|
|
56
|
+
await this.withRetry(() => this.adminClient.authenticationManagement.createFlow({ ...flow, realm }));
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
this.handleError(error);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Delete an authentication flow
|
|
64
|
+
*/
|
|
65
|
+
async deleteFlow(realm, flowId) {
|
|
66
|
+
this.requireScope('authentication:write');
|
|
67
|
+
try {
|
|
68
|
+
await this.withRetry(() => this.adminClient.authenticationManagement.deleteFlow({ realm, flowId }));
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.handleError(error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get executions for a flow
|
|
76
|
+
*/
|
|
77
|
+
async getExecutions(realm, flowAlias) {
|
|
78
|
+
this.requireScope('authentication:read');
|
|
79
|
+
try {
|
|
80
|
+
return (await this.withRetry(() => this.adminClient.authenticationManagement.getExecutions({ realm, flow: flowAlias })));
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return this.handleError(error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Add an execution to a flow
|
|
88
|
+
*/
|
|
89
|
+
async createExecution(realm, flowAlias, execution) {
|
|
90
|
+
this.requireScope('authentication:write');
|
|
91
|
+
try {
|
|
92
|
+
await this.withRetry(() => this.adminClient.authenticationManagement.addExecution({ realm, flow: flowAlias }, execution));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.handleError(error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=authentication.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication.service.js","sourceRoot":"","sources":["../../../../src/admin/client/services/authentication.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type KcAdminClient from '@keycloak/keycloak-admin-client';
|
|
2
|
+
import type { Logger } from '@pawells/logger';
|
|
3
|
+
import type { RetryConfig } from '../utils/index.js';
|
|
4
|
+
import type { KeycloakAdminScope } from '../../permissions/keycloak-admin.permissions.js';
|
|
5
|
+
/**
|
|
6
|
+
* Base service class for Keycloak admin API client services.
|
|
7
|
+
*
|
|
8
|
+
* Provides shared functionality for all admin sub-services: error handling with classified
|
|
9
|
+
* exceptions, retry logic for transient failures, and scope-based access control.
|
|
10
|
+
* All Keycloak admin operations (user, role, client, group management, etc.) inherit from this class.
|
|
11
|
+
*
|
|
12
|
+
* Subclasses must call {@link requireScope} before API operations to enforce permission control.
|
|
13
|
+
*
|
|
14
|
+
* @abstract
|
|
15
|
+
*/
|
|
16
|
+
export declare abstract class BaseService {
|
|
17
|
+
private readonly logger;
|
|
18
|
+
protected adminClient: KcAdminClient;
|
|
19
|
+
protected grantedScopes: ReadonlySet<KeycloakAdminScope>;
|
|
20
|
+
protected loggerConfig?: Logger;
|
|
21
|
+
protected retryConfig?: RetryConfig;
|
|
22
|
+
constructor(adminClient: KcAdminClient, grantedScopes: ReadonlySet<KeycloakAdminScope>, loggerConfig?: Logger, retryConfig?: RetryConfig);
|
|
23
|
+
/**
|
|
24
|
+
* Asserts that the given scope is granted. Throws {@link KeycloakAdminScopeError}
|
|
25
|
+
* synchronously if not, before any network request is made.
|
|
26
|
+
* All mutation operations ({@link KeycloakAdminScope} ending in `:write`) are
|
|
27
|
+
* audit-logged at INFO level when the check passes.
|
|
28
|
+
*/
|
|
29
|
+
protected requireScope(scope: KeycloakAdminScope): void;
|
|
30
|
+
/**
|
|
31
|
+
* Execute a function with retry logic
|
|
32
|
+
*/
|
|
33
|
+
protected withRetry<T>(fn: () => Promise<T>, options?: RetryConfig): Promise<T>;
|
|
34
|
+
/**
|
|
35
|
+
* Handle and transform errors from Keycloak admin client
|
|
36
|
+
*/
|
|
37
|
+
protected handleError(error: unknown): never;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=base-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-service.d.ts","sourceRoot":"","sources":["../../../../src/admin/client/services/base-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAWrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAS1F;;;;;;;;;;GAUG;AACH,8BAAsB,WAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC,SAAS,CAAC,WAAW,EAAE,aAAa,CAAC;IAErC,SAAS,CAAC,aAAa,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEzD,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEhC,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;gBAGnC,WAAW,EAAE,aAAa,EAC1B,aAAa,EAAE,WAAW,CAAC,kBAAkB,CAAC,EAC9C,YAAY,CAAC,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,WAAW;IAS1B;;;;;OAKG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAWvD;;OAEG;cACa,SAAS,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC;IAWb;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK;CAyD5C"}
|