@adatechnology/auth-keycloak 0.0.1 → 0.0.3
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/README.md +46 -0
- package/dist/errors/keycloak-error.d.ts +11 -0
- package/dist/errors/keycloak-error.js +20 -0
- package/dist/errors/keycloak-error.js.map +1 -0
- package/dist/index.d.ts +6 -65
- package/dist/index.js +16 -15132
- package/dist/index.js.map +1 -0
- package/dist/{src/keycloak.client.d.ts → keycloak.client.d.ts} +10 -3
- package/dist/keycloak.client.js +320 -0
- package/dist/keycloak.client.js.map +1 -0
- package/dist/{src/keycloak.http.interceptor.d.ts → keycloak.http.interceptor.d.ts} +2 -4
- package/dist/{src/keycloak.http.interceptor.js → keycloak.http.interceptor.js} +14 -16
- package/dist/keycloak.http.interceptor.js.map +1 -0
- package/dist/{src/keycloak.interface.d.ts → keycloak.interface.d.ts} +25 -3
- package/dist/keycloak.interface.js +3 -0
- package/dist/keycloak.interface.js.map +1 -0
- package/dist/keycloak.module.js +63 -0
- package/dist/keycloak.module.js.map +1 -0
- package/dist/keycloak.token.js +7 -0
- package/dist/keycloak.token.js.map +1 -0
- package/dist/roles.decorator.d.ts +19 -0
- package/dist/roles.decorator.js +34 -0
- package/dist/roles.decorator.js.map +1 -0
- package/dist/roles.guard.d.ts +10 -0
- package/dist/roles.guard.js +103 -0
- package/dist/roles.guard.js.map +1 -0
- package/package.json +13 -6
- package/dist/index.mjs +0 -15128
- package/dist/src/index.d.ts +0 -3
- package/dist/src/index.js +0 -2
- package/dist/src/keycloak.client.js +0 -140
- package/dist/src/keycloak.interface.js +0 -1
- package/dist/src/keycloak.module.js +0 -40
- package/dist/src/keycloak.token.js +0 -3
- package/dist/tsconfig.tsbuildinfo +0 -1
- /package/dist/{src/keycloak.module.d.ts → keycloak.module.d.ts} +0 -0
- /package/dist/{src/keycloak.token.d.ts → keycloak.token.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -72,6 +72,52 @@ Notas
|
|
|
72
72
|
- Este módulo depende de `@adatechnology/http-client` (provider `HTTP_PROVIDER`) para realizar chamadas HTTP ao Keycloak. Configure o `HttpModule` conforme necessário na aplicação que consome este pacote.
|
|
73
73
|
- O interceptor `KeycloakHttpInterceptor` é fornecido caso queira integrar com outras camadas que aceitem interceptors.
|
|
74
74
|
|
|
75
|
+
## Autorização (decorator @Roles)
|
|
76
|
+
|
|
77
|
+
O pacote agora fornece um decorator `@Roles()` e um `RolesGuard` para uso nas rotas do NestJS. Exemplos:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { Controller, Get, UseGuards } from "@nestjs/common";
|
|
81
|
+
import { Roles } from "@adatechnology/auth-keycloak";
|
|
82
|
+
import { RolesGuard } from "@adatechnology/auth-keycloak";
|
|
83
|
+
|
|
84
|
+
@Controller("secure")
|
|
85
|
+
@UseGuards(RolesGuard)
|
|
86
|
+
export class SecureController {
|
|
87
|
+
@Get("admin")
|
|
88
|
+
@Roles("admin") // aceita um ou mais roles (OR por padrão)
|
|
89
|
+
adminOnly() {
|
|
90
|
+
return { ok: true };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Get("team")
|
|
94
|
+
@Roles({ roles: ["manager", "lead"], mode: "all" }) // requer ambos (AND)
|
|
95
|
+
teamOnly() {
|
|
96
|
+
return { ok: true };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
O `RolesGuard` extrai roles do payload do JWT (claims `realm_access.roles` e `resource_access[clientId].roles`). Por padrão o decorator verifica ambos (realm e client). Você pode ajustar o comportamento usando as opções `{ type: 'realm'|'client'|'both' }`.
|
|
102
|
+
|
|
103
|
+
## Erros
|
|
104
|
+
|
|
105
|
+
O pacote exporta `KeycloakError` (classe) que é usada para representar falhas nas chamadas HTTP ao Keycloak. A classe contém `statusCode` e `details` para permitir um tratamento declarativo dos erros na aplicação que consome a biblioteca. Exemplo:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import { KeycloakError } from "@adatechnology/auth-keycloak";
|
|
109
|
+
|
|
110
|
+
try {
|
|
111
|
+
await keycloakClient.getUserInfo(token);
|
|
112
|
+
} catch (e) {
|
|
113
|
+
if (e instanceof KeycloakError) {
|
|
114
|
+
// tratar problema específico de Keycloak
|
|
115
|
+
console.error(e.statusCode, e.details);
|
|
116
|
+
}
|
|
117
|
+
throw e;
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
75
121
|
Contribuições
|
|
76
122
|
|
|
77
123
|
Relate issues/PRs no repositório principal. Mantenha compatibilidade com o padrão usado pelo `HttpModule`.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class KeycloakError extends Error {
|
|
2
|
+
readonly statusCode?: number;
|
|
3
|
+
readonly details?: unknown;
|
|
4
|
+
readonly keycloakError?: string;
|
|
5
|
+
constructor(message: string, opts?: {
|
|
6
|
+
statusCode?: number;
|
|
7
|
+
details?: unknown;
|
|
8
|
+
keycloakError?: string;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export default KeycloakError;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KeycloakError = void 0;
|
|
4
|
+
class KeycloakError extends Error {
|
|
5
|
+
statusCode;
|
|
6
|
+
details;
|
|
7
|
+
keycloakError;
|
|
8
|
+
constructor(message, opts) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "KeycloakError";
|
|
11
|
+
this.statusCode = opts?.statusCode;
|
|
12
|
+
this.details = opts?.details;
|
|
13
|
+
this.keycloakError = opts?.keycloakError;
|
|
14
|
+
// maintain proper prototype chain
|
|
15
|
+
Object.setPrototypeOf(this, KeycloakError.prototype);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.KeycloakError = KeycloakError;
|
|
19
|
+
exports.default = KeycloakError;
|
|
20
|
+
//# sourceMappingURL=keycloak-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keycloak-error.js","sourceRoot":"","sources":["../../src/errors/keycloak-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAc,SAAQ,KAAK;IACtB,UAAU,CAAU;IACpB,OAAO,CAAW;IAClB,aAAa,CAAU;IAEvC,YACE,OAAe,EACf,IAAyE;QAEzE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,EAAE,UAAU,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,EAAE,aAAa,CAAC;QACzC,kCAAkC;QAClC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACF;AAjBD,sCAiBC;AAED,kBAAe,aAAa,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,65 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
interface KeycloakTokenResponse {
|
|
8
|
-
access_token: string;
|
|
9
|
-
expires_in: number;
|
|
10
|
-
refresh_expires_in: number;
|
|
11
|
-
refresh_token: string;
|
|
12
|
-
token_type: string;
|
|
13
|
-
'not-before-policy': number;
|
|
14
|
-
session_state: string;
|
|
15
|
-
scope: string;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Keycloak client credentials
|
|
19
|
-
*/
|
|
20
|
-
interface KeycloakCredentials {
|
|
21
|
-
clientId: string;
|
|
22
|
-
clientSecret: string;
|
|
23
|
-
username?: string;
|
|
24
|
-
password?: string;
|
|
25
|
-
grantType: 'client_credentials' | 'password';
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Keycloak configuration
|
|
29
|
-
*/
|
|
30
|
-
interface KeycloakConfig {
|
|
31
|
-
baseUrl: string;
|
|
32
|
-
realm: string;
|
|
33
|
-
credentials: KeycloakCredentials;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Keycloak client interface
|
|
37
|
-
*/
|
|
38
|
-
interface KeycloakClientInterface {
|
|
39
|
-
/**
|
|
40
|
-
* Get access token
|
|
41
|
-
*/
|
|
42
|
-
getAccessToken(): Promise<string>;
|
|
43
|
-
/**
|
|
44
|
-
* Refresh access token
|
|
45
|
-
*/
|
|
46
|
-
refreshToken(refreshToken: string): Promise<KeycloakTokenResponse>;
|
|
47
|
-
/**
|
|
48
|
-
* Validate token
|
|
49
|
-
*/
|
|
50
|
-
validateToken(token: string): Promise<boolean>;
|
|
51
|
-
/**
|
|
52
|
-
* Get user info
|
|
53
|
-
*/
|
|
54
|
-
getUserInfo(token: string): Promise<any>;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
declare class KeycloakModule {
|
|
58
|
-
static forRoot(config: KeycloakConfig, httpConfig?: AxiosRequestConfig | AxiosInstance): DynamicModule;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
declare const KEYCLOAK_CONFIG = "KEYCLOAK_CONFIG";
|
|
62
|
-
declare const KEYCLOAK_CLIENT = "KEYCLOAK_CLIENT";
|
|
63
|
-
declare const KEYCLOAK_HTTP_INTERCEPTOR = "KEYCLOAK_HTTP_INTERCEPTOR";
|
|
64
|
-
|
|
65
|
-
export { KEYCLOAK_CLIENT, KEYCLOAK_CONFIG, KEYCLOAK_HTTP_INTERCEPTOR, KeycloakClientInterface, KeycloakConfig, KeycloakModule, KeycloakTokenResponse };
|
|
1
|
+
export { KeycloakModule } from "./keycloak.module";
|
|
2
|
+
export { KEYCLOAK_CONFIG, KEYCLOAK_CLIENT, KEYCLOAK_HTTP_INTERCEPTOR, } from "./keycloak.token";
|
|
3
|
+
export type { KeycloakConfig, KeycloakClientInterface, KeycloakTokenResponse, } from "./keycloak.interface";
|
|
4
|
+
export { Roles } from "./roles.decorator";
|
|
5
|
+
export { RolesGuard } from "./roles.guard";
|
|
6
|
+
export { KeycloakError } from "./errors/keycloak-error";
|