@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.
- package/dist/connections.d.ts +82 -71
- package/dist/connections.js +89 -957
- package/dist/connections.js.map +1 -1
- package/package.json +2 -4
package/dist/connections.d.ts
CHANGED
|
@@ -1,88 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* App Connections —
|
|
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 (
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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
|
|
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
|
|
97
|
-
* Handler — não retorna (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`
|
|
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 {
|
|
124
|
+
export { type AppConnectionAccessToken, AppConnectionError, type AppConnectionToken, type AppConnectionsConfig, type ConnectAppParams, completeAppConnection, connectApp, connectionFetch, getConnectionAccessToken, rotateConnectionToken };
|