@geekapps/auth-nextjs 0.16.1 → 0.17.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.
@@ -1,88 +1,39 @@
1
1
  /**
2
- * App Connections — chamar ações de negócio de OUTRA Application.
2
+ * App Connections — agir como um usuário numa organização de OUTRA Application.
3
3
  *
4
- * Uma conexão liga um USUÁRIO desta app (X) a uma app alvo (Y). Ele a aprova
5
- * uma vez no consent, escolhendo as ações liberadas e a organização dentro do
6
- * Y sob a qual elas rodam. A chamada vai com o access token desse usuário (o
7
- * da sessão, por padrão): é ele que diz ao proxy qual conexão usar.
4
+ * Uma conexão liga um USUÁRIO desta app (X) a uma organização da app alvo (Z)
5
+ * de que ele já é membro. Ele a aprova uma vez, no consent; o auth-server
6
+ * devolve a esta app um API token (`gka_…`). Daí em diante esta app guarda o
7
+ * token e o usa quando quiser — com ou sem o usuário logado, num cron, num
8
+ * workflow — trocando-o por um JWT curto que age COMO o usuário naquela
9
+ * organização (`getConnectionAccessToken`). As permissions são as do usuário
10
+ * na organização, hoje: mudou o role dele lá, a conexão muda junto; saiu da
11
+ * organização, ela para.
8
12
  *
9
- * Nada aqui fala com a API do Y diretamente: tudo passa pelo proxy do
10
- * auth-server, que valida a conexão e injeta a credencial. Esta app nunca vê
11
- * essa credencial — é esse o ponto do proxy.
12
- *
13
- * O catálogo tipado (`GeekappsConnections`) vem do arquivo gerado por
14
- * `npx geekapps-connections`.
13
+ * ⚠️ ATENÇÃO — o API token é uma credencial de longa duração.
14
+ * • Guarde-o cifrado, associado ao usuário que aprovou a conexão.
15
+ * • Use-o só para agir em nome DESSE usuário. Usar o token de A para atender
16
+ * um pedido de B dá a B o acesso de A à organização alvo.
17
+ * • Restringir quem pode disparar uma chamada, e o que ela pode pedir, é
18
+ * responsabilidade desta app: o auth-server não tem como saber.
19
+ * • Vazou? Revogue no dashboard do Geekapps Auth ou gire com `rotateConnectionToken`.
15
20
  */
16
- /** Opções por chamada. Sem `userToken`, usa o access token do usuário logado na sessão. */
17
- type ConnectionCallOptions = {
18
- userToken?: string;
19
- };
20
21
  type AppConnectionsConfig = {
21
22
  issuer?: string;
22
23
  /** client_id/secret desta app (a consumidora, X). */
23
24
  clientId?: string;
24
25
  clientSecret?: string;
25
26
  };
26
- /**
27
- * Preenchida por declaration merging no arquivo gerado
28
- * (`geekapps-connections.d.ts`). Vazia aqui de propósito: o SDK não sabe
29
- * quais apps existem — quem sabe é o auth-server, no momento da geração.
30
- */
31
- interface GeekappsConnections {
32
- }
33
- /** Erro de uma chamada de proxy — carrega o status HTTP para dar pra tratar. */
27
+ /** Erro de uma chamada ao auth-server — carrega o status HTTP para dar pra tratar. */
34
28
  declare class AppConnectionError extends Error {
35
29
  readonly status: number;
36
30
  readonly code: string | undefined;
37
31
  readonly body: unknown;
38
32
  constructor(message: string, status: number, code: string | undefined, body: unknown);
39
33
  }
40
- /**
41
- * A chamada crua do proxy, para quando não há catálogo gerado. `targetAppId` é
42
- * o client_id da app alvo e `actionKey` é a AppAction.key — o mesmo valor que
43
- * aparece como scope no consent.
44
- */
45
- declare function callAppConnection<T = unknown>(params: {
46
- targetAppId: string;
47
- actionKey: string;
48
- payload?: unknown;
49
- /** Access token do usuário dono da conexão. Padrão: o do usuário logado. */
50
- userToken?: string;
51
- config?: AppConnectionsConfig;
52
- }): Promise<T>;
53
- type ConnectionRegistryEntry = {
54
- appId: string;
55
- actions: Record<string, string>;
56
- };
57
- /** Chamado por arquivos gerados no formato antigo. Não é necessário no fluxo automático. */
58
- declare function registerConnections(entries: Record<string, ConnectionRegistryEntry>): void;
59
- /**
60
- * Sem tipos gerados (primeira execução), qualquer `app.ação` é aceita. Assim
61
- * que o SDK escreve `geekapps-connections.d.ts`, a interface estendida passa a
62
- * valer e o TypeScript confere payload e retorno.
63
- */
64
- type AppConnectionsClient = keyof GeekappsConnections extends never ? Record<string, Record<string, (payload?: unknown, options?: ConnectionCallOptions) => Promise<unknown>>> : GeekappsConnections;
65
- /** Cliente com config explícita — para quem não usa as env vars padrão. */
66
- declare function createAppConnections(config?: AppConnectionsConfig): AppConnectionsClient;
67
- /** Catálogo explícito, como o gerado por `npx geekapps-connections` (`geekappsConnectionsCatalog`). */
68
- type ConnectionsCatalog = Record<string, {
69
- readonly appId: string;
70
- readonly actions: Readonly<Record<string, string>>;
71
- }>;
72
- /**
73
- * Opcional: usa um catálogo fixo em vez de consultar o auth-server. Útil em
74
- * testes ou quando a app não pode falar com o servidor em runtime.
75
- *
76
- * const connections = defineAppConnections<GeekappsConnections>(geekappsConnectionsCatalog);
77
- */
78
- declare function defineAppConnections<T>(catalog: ConnectionsCatalog, config?: AppConnectionsConfig): T;
79
- /** Cliente padrão, lendo GEEKAPPS_AUTH_CLIENT_ID / _SECRET do ambiente. */
80
- declare const appConnections: AppConnectionsClient;
81
34
  type ConnectAppParams = {
82
- /** client_id da app ALVO (a que expõe as ações). */
35
+ /** client_id da app ALVO (a que vai ser acessada). */
83
36
  targetAppId: string;
84
- /** AppAction.key das ações pedidas — as mesmas que aparecem no consent. */
85
- actions: string[];
86
37
  /** URL desta app que recebe o retorno do consent (rota que chama `completeAppConnection`). Precisa estar nos redirect URIs desta app. */
87
38
  redirectUri: string;
88
39
  /** Para onde `completeAppConnection` manda o usuário depois (padrão "/"). */
@@ -93,13 +44,26 @@ type ConnectAppParams = {
93
44
  };
94
45
  /**
95
46
  * Inicia a conexão desta app com `targetAppId`: guarda PKCE/state em cookies
96
- * httpOnly e redireciona para o consent. Chame de um Server Action ou Route
97
- * Handler — não retorna (o `redirect` do Next interrompe a execução).
47
+ * httpOnly e redireciona para o consent, onde o usuário escolhe a organização
48
+ * e a validade. Chame de um Server Action ou Route Handler — não retorna (o
49
+ * `redirect` do Next interrompe a execução).
98
50
  */
99
51
  declare function connectApp(params: ConnectAppParams): Promise<never>;
52
+ /** A conexão recém-criada. O `token` só aparece aqui, uma única vez. */
53
+ type AppConnectionToken = {
54
+ /** API token (`gka_…`). Guarde-o cifrado, associado ao usuário que aprovou. */
55
+ token: string;
56
+ connectionId: string;
57
+ /** null = sem expiração. */
58
+ expiresAt: string | null;
59
+ /** Organização da app alvo em que a conexão age. */
60
+ organizationId: string;
61
+ targetAppId: string;
62
+ };
100
63
  /**
101
64
  * Fecha o fluxo de `connectApp`. Chame no callback com o `code` e o `state`
102
- * da query; devolve o `returnTo` para você redirecionar. Lança
65
+ * da query; devolve o `returnTo` e a conexão, com o API token — a ÚNICA vez em
66
+ * que ele aparece, então persista-o antes de redirecionar. Lança
103
67
  * AppConnectionError se o state não bater ou o auth-server recusar.
104
68
  */
105
69
  declare function completeAppConnection(params: {
@@ -108,6 +72,53 @@ declare function completeAppConnection(params: {
108
72
  config?: AppConnectionsConfig;
109
73
  }): Promise<{
110
74
  returnTo: string;
75
+ connection: AppConnectionToken;
76
+ }>;
77
+ /** Resultado de `getConnectionAccessToken`. */
78
+ type AppConnectionAccessToken = {
79
+ /** JWT curto: use em `Authorization: Bearer` contra a API da app alvo. */
80
+ accessToken: string;
81
+ /** Segundos até o JWT vencer. */
82
+ expiresIn: number;
83
+ organizationId: string;
84
+ targetAppId: string;
85
+ /** apiBaseUrl da app alvo, quando ela declarou uma. */
86
+ targetApiBaseUrl: string | null;
87
+ };
88
+ /**
89
+ * Troca o API token por um JWT curto que age como o usuário na organização da
90
+ * conexão. Não exige ninguém logado. O resultado fica em cache até perto de
91
+ * vencer, então pode ser chamado a cada requisição.
92
+ *
93
+ * Erros possíveis (`AppConnectionError.code`): `invalid_token`,
94
+ * `connection_inactive` (revogada), `connection_expired`,
95
+ * `membership_required` (o usuário saiu da organização).
96
+ */
97
+ declare function getConnectionAccessToken(params: {
98
+ /** O API token guardado por esta app. */
99
+ connectionToken: string;
100
+ config?: AppConnectionsConfig;
101
+ }): Promise<AppConnectionAccessToken>;
102
+ /**
103
+ * Atalho: um `fetch` contra a API da app alvo já com o JWT da conexão. `path`
104
+ * é relativo ao `apiBaseUrl` da app alvo (ou uma URL absoluta).
105
+ */
106
+ declare function connectionFetch(params: {
107
+ connectionToken: string;
108
+ path: string;
109
+ init?: RequestInit;
110
+ config?: AppConnectionsConfig;
111
+ }): Promise<Response>;
112
+ /**
113
+ * Gira o API token: o antigo deixa de valer na hora e o novo é devolvido (a
114
+ * validade da conexão não muda). Persista o novo no lugar do antigo.
115
+ */
116
+ declare function rotateConnectionToken(params: {
117
+ connectionToken: string;
118
+ config?: AppConnectionsConfig;
119
+ }): Promise<{
120
+ token: string;
121
+ expiresAt: string | null;
111
122
  }>;
112
123
 
113
- export { AppConnectionError, type AppConnectionsClient, type AppConnectionsConfig, type ConnectAppParams, type ConnectionCallOptions, type ConnectionsCatalog, type GeekappsConnections, appConnections, callAppConnection, completeAppConnection, connectApp, createAppConnections, defineAppConnections, registerConnections };
124
+ export { type AppConnectionAccessToken, AppConnectionError, type AppConnectionToken, type AppConnectionsConfig, type ConnectAppParams, completeAppConnection, connectApp, connectionFetch, getConnectionAccessToken, rotateConnectionToken };