@adonis-agora/authkit-client 0.11.0 → 0.13.0

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.
@@ -11,7 +11,13 @@ export interface AuthenticatorDeps {
11
11
  /** lê o access token do token set da sessão (opcional; usado por resolvers userinfo) */
12
12
  getAccessToken?: () => string | null | undefined;
13
13
  }
14
- export declare class Authenticator {
14
+ /**
15
+ * Autenticador do request. O parâmetro `TUser` é o tipo do usuário do app que `resolveUser`
16
+ * devolve — o app o fixa via augmentation de `HttpContext.auth` (`auth: Authenticator<AppUser>`),
17
+ * e aí `getUser()` passa a devolver `AppUser | null` em todo call-site, sem cast. Default `unknown`
18
+ * mantém o comportamento anterior (nada a mudar em quem não augmenta).
19
+ */
20
+ export declare class Authenticator<TUser = unknown> {
15
21
  #private;
16
22
  private ctx;
17
23
  private deps;
@@ -21,7 +27,15 @@ export declare class Authenticator {
21
27
  authenticate(): Promise<Identity>;
22
28
  check(): Promise<boolean>;
23
29
  hasGlobalRole(role: string): boolean;
24
- getUser(): Promise<unknown>;
30
+ getUser(): Promise<TUser | null>;
31
+ /**
32
+ * O `TUser` autenticado, NÃO-nulo. Fail-closed: lança quando não há sessão (ou quando `resolveUser`
33
+ * não devolve usuário) — pensado para rotas atrás do middleware de auth, onde `null` seria uma
34
+ * rota mal-configurada, não um visitante. Espelha `authenticate()` (que devolve a `Identity`); este
35
+ * devolve o usuário do app. Substitui o wrapper `currentUser(auth)` que cada app reescrevia sobre
36
+ * `getUser()`. Para rotas que aceitam visitante, use `getUser()` (devolve `TUser | null`).
37
+ */
38
+ getUserOrFail(): Promise<TUser>;
25
39
  /**
26
40
  * Monta o objeto pronto para compartilhar com o frontend (ex.: Inertia share),
27
41
  * casando com o `AuthSharedProps` que o `@adonis-agora/authkit-react` consome.
@@ -29,7 +43,7 @@ export declare class Authenticator {
29
43
  * é responsabilidade do `@adonis-agora/authz` — o AuthKit só autentica.
30
44
  */
31
45
  toSharedProps(): Promise<{
32
- user: unknown;
46
+ user: TUser | null;
33
47
  globalRoles: string[];
34
48
  } | null>;
35
49
  }
@@ -1,11 +1,17 @@
1
- import { AUTHKIT_METRICS, NoopRecorder } from "@adonis-agora/authkit-core";
1
+ import { AUTHKIT_METRICS, NoopRecorder, } from "@adonis-agora/authkit-core";
2
2
  import { populateContext } from "./observability/context_bridge.js";
3
+ /**
4
+ * Autenticador do request. O parâmetro `TUser` é o tipo do usuário do app que `resolveUser`
5
+ * devolve — o app o fixa via augmentation de `HttpContext.auth` (`auth: Authenticator<AppUser>`),
6
+ * e aí `getUser()` passa a devolver `AppUser | null` em todo call-site, sem cast. Default `unknown`
7
+ * mantém o comportamento anterior (nada a mudar em quem não augmenta).
8
+ */
3
9
  export class Authenticator {
4
10
  ctx;
5
11
  deps;
6
12
  #identity = null;
7
13
  #resolved = false;
8
- #user;
14
+ #user = null;
9
15
  #userResolved = false;
10
16
  #recorder;
11
17
  constructor(ctx, deps, recorder = new NoopRecorder()) {
@@ -56,7 +62,11 @@ export class Authenticator {
56
62
  const identity = await this.getIdentity();
57
63
  if (identity && this.deps.resolveUser) {
58
64
  const accessToken = this.deps.getAccessToken?.() ?? undefined;
59
- this.#user = await this.deps.resolveUser(identity, { accessToken });
65
+ // `resolveUser` é tipado `Promise<unknown>` (a lib não conhece o model do app); o `TUser`
66
+ // é a asserção do consumidor, feita UMA vez aqui em vez de em cada call-site de `getUser()`.
67
+ this.#user = (await this.deps.resolveUser(identity, {
68
+ accessToken,
69
+ }));
60
70
  }
61
71
  else {
62
72
  this.#user = null;
@@ -64,6 +74,20 @@ export class Authenticator {
64
74
  this.#userResolved = true;
65
75
  return this.#user;
66
76
  }
77
+ /**
78
+ * O `TUser` autenticado, NÃO-nulo. Fail-closed: lança quando não há sessão (ou quando `resolveUser`
79
+ * não devolve usuário) — pensado para rotas atrás do middleware de auth, onde `null` seria uma
80
+ * rota mal-configurada, não um visitante. Espelha `authenticate()` (que devolve a `Identity`); este
81
+ * devolve o usuário do app. Substitui o wrapper `currentUser(auth)` que cada app reescrevia sobre
82
+ * `getUser()`. Para rotas que aceitam visitante, use `getUser()` (devolve `TUser | null`).
83
+ */
84
+ async getUserOrFail() {
85
+ const user = await this.getUser();
86
+ if (user === null) {
87
+ throw new Error("Not authenticated: no user for the current session");
88
+ }
89
+ return user;
90
+ }
67
91
  /**
68
92
  * Monta o objeto pronto para compartilhar com o frontend (ex.: Inertia share),
69
93
  * casando com o `AuthSharedProps` que o `@adonis-agora/authkit-react` consome.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/authkit-client",
3
- "version": "0.11.0",
3
+ "version": "0.13.0",
4
4
  "description": "AdonisJS OIDC/OAuth2 relying-party (client) toolkit: session-based authentication against an OpenID Connect identity provider, with JWT/PAT user resolvers and OpenTelemetry metrics.",
5
5
  "license": "MIT",
6
6
  "author": "dudousxd",
@@ -82,7 +82,7 @@
82
82
  "ioredis-mock": "^8.9.0",
83
83
  "@types/node": "25.9.1",
84
84
  "typescript": "6.0.3",
85
- "@adonis-agora/authkit-server": "0.35.0"
85
+ "@adonis-agora/authkit-server": "0.36.0"
86
86
  },
87
87
  "scripts": {
88
88
  "build": "tsc && node -e \"require('node:fs').cpSync('stubs','build/stubs',{recursive:true,filter:(s)=>!s.endsWith('.ts')})\"",