@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.
Files changed (37) hide show
  1. package/README.md +46 -0
  2. package/dist/errors/keycloak-error.d.ts +11 -0
  3. package/dist/errors/keycloak-error.js +20 -0
  4. package/dist/errors/keycloak-error.js.map +1 -0
  5. package/dist/index.d.ts +6 -65
  6. package/dist/index.js +16 -15132
  7. package/dist/index.js.map +1 -0
  8. package/dist/{src/keycloak.client.d.ts → keycloak.client.d.ts} +10 -3
  9. package/dist/keycloak.client.js +320 -0
  10. package/dist/keycloak.client.js.map +1 -0
  11. package/dist/{src/keycloak.http.interceptor.d.ts → keycloak.http.interceptor.d.ts} +2 -4
  12. package/dist/{src/keycloak.http.interceptor.js → keycloak.http.interceptor.js} +14 -16
  13. package/dist/keycloak.http.interceptor.js.map +1 -0
  14. package/dist/{src/keycloak.interface.d.ts → keycloak.interface.d.ts} +25 -3
  15. package/dist/keycloak.interface.js +3 -0
  16. package/dist/keycloak.interface.js.map +1 -0
  17. package/dist/keycloak.module.js +63 -0
  18. package/dist/keycloak.module.js.map +1 -0
  19. package/dist/keycloak.token.js +7 -0
  20. package/dist/keycloak.token.js.map +1 -0
  21. package/dist/roles.decorator.d.ts +19 -0
  22. package/dist/roles.decorator.js +34 -0
  23. package/dist/roles.decorator.js.map +1 -0
  24. package/dist/roles.guard.d.ts +10 -0
  25. package/dist/roles.guard.js +103 -0
  26. package/dist/roles.guard.js.map +1 -0
  27. package/package.json +13 -6
  28. package/dist/index.mjs +0 -15128
  29. package/dist/src/index.d.ts +0 -3
  30. package/dist/src/index.js +0 -2
  31. package/dist/src/keycloak.client.js +0 -140
  32. package/dist/src/keycloak.interface.js +0 -1
  33. package/dist/src/keycloak.module.js +0 -40
  34. package/dist/src/keycloak.token.js +0 -3
  35. package/dist/tsconfig.tsbuildinfo +0 -1
  36. /package/dist/{src/keycloak.module.d.ts → keycloak.module.d.ts} +0 -0
  37. /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
- import { DynamicModule } from '@nestjs/common';
2
- import { AxiosRequestConfig, AxiosInstance } from 'axios';
3
-
4
- /**
5
- * Keycloak token response
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";