@adonis-agora/authkit-server 1.0.0-rc.15 → 1.0.0-rc.16

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @adonis-agora/authkit-server
2
2
 
3
+ ## 1.0.0-rc.16
4
+
5
+ ### Patch Changes
6
+
7
+ - [#483](https://github.com/DavideCarvalho/adonis-agora-authkit/pull/483) [`dcfbed1`](https://github.com/DavideCarvalho/adonis-agora-authkit/commit/dcfbed164d3d79dae3f37ad70ad07b5450822887) Thanks [@DavideCarvalho](https://github.com/DavideCarvalho)! - The `authkit.server` service gains `bindBearerAccount(ctx, accountId)`. Code that verified an authkit access token outside `oidcBearerGuard` (for example `@adonis-agora/agent`'s dev MCP endpoint) calls it to put the caller on the request: `getAccountId(ctx)` and `realAccountId(ctx)` then return that account, and `impersonationState(ctx)` reports no impersonation. A console session on the same request still wins.
8
+
3
9
  ## 1.0.0-rc.15
4
10
 
5
11
  ### Patch Changes
@@ -1,5 +1,13 @@
1
1
  /** Registra a conta autenticada via bearer nesta request. */
2
2
  export declare function setBearerAccountId(ctx: object, accountId: string): void;
3
+ /**
4
+ * Vincula a conta de um bearer que foi autenticado FORA do `oidcBearerGuard`
5
+ * (ex.: o endpoint MCP do agent) a esta request, para que `getAccountId`,
6
+ * `realAccountId` e `impersonationState` vejam quem chamou. O chamador conta
7
+ * como "sem impersonation": qualquer impersonation bearer anterior desta request
8
+ * é esquecida.
9
+ */
10
+ export declare function bindBearerAccount(ctx: object, accountId: string): void;
3
11
  /** Esquece a conta bearer desta request (falha de autenticação). */
4
12
  export declare function clearBearerAccountId(ctx: object): void;
5
13
  /**
@@ -16,6 +16,17 @@ const bearerImpersonations = new WeakMap();
16
16
  export function setBearerAccountId(ctx, accountId) {
17
17
  bearerAccounts.set(ctx, accountId);
18
18
  }
19
+ /**
20
+ * Vincula a conta de um bearer que foi autenticado FORA do `oidcBearerGuard`
21
+ * (ex.: o endpoint MCP do agent) a esta request, para que `getAccountId`,
22
+ * `realAccountId` e `impersonationState` vejam quem chamou. O chamador conta
23
+ * como "sem impersonation": qualquer impersonation bearer anterior desta request
24
+ * é esquecida.
25
+ */
26
+ export function bindBearerAccount(ctx, accountId) {
27
+ bearerAccounts.set(ctx, accountId);
28
+ bearerImpersonations.delete(ctx);
29
+ }
19
30
  /** Esquece a conta bearer desta request (falha de autenticação). */
20
31
  export function clearBearerAccountId(ctx) {
21
32
  bearerAccounts.delete(ctx);
@@ -104,4 +104,12 @@ export declare class OidcService {
104
104
  * é um detalhe interno acessível via o helper `weak_cache` do próprio provider.
105
105
  */
106
106
  evictDynamicClientCache(): Promise<void>;
107
+ /**
108
+ * Vincula a conta de um access token que você verificou FORA do guard bearer do
109
+ * AuthKit (ex.: o endpoint MCP do `@adonis-agora/agent`) a esta request:
110
+ * `getAccountId(ctx)` e `realAccountId(ctx)` passam a devolver `accountId`, e
111
+ * `impersonationState(ctx)` responde "sem impersonation". Uma sessão de console
112
+ * na mesma request continua ganhando.
113
+ */
114
+ bindBearerAccount(ctx: object, accountId: string): void;
107
115
  }
@@ -4,6 +4,7 @@ import Koa from 'koa';
4
4
  import mount from 'koa-mount';
5
5
  import { ProviderIdentities } from '../accounts/provider_identities.js';
6
6
  import { normalizeActiveOrg, readActiveOrgFromKoaCtx, verifyActiveOrgMembership, } from '../host/active_org_cookie.js';
7
+ import { bindBearerAccount } from '../host/bearer_account.js';
7
8
  import { isFirstPartyClient } from '../host/branding.js';
8
9
  import { listKeyInfos, signingKeyAgeDays, toPublicJwks, } from '../keys/keystore.js';
9
10
  import { wireProviderEvents } from '../observability/wire_provider_events.js';
@@ -338,4 +339,14 @@ export class OidcService {
338
339
  // imediata da entrada órfã. Best-effort — não propaga erro pro caminho da request.
339
340
  }
340
341
  }
342
+ /**
343
+ * Vincula a conta de um access token que você verificou FORA do guard bearer do
344
+ * AuthKit (ex.: o endpoint MCP do `@adonis-agora/agent`) a esta request:
345
+ * `getAccountId(ctx)` e `realAccountId(ctx)` passam a devolver `accountId`, e
346
+ * `impersonationState(ctx)` responde "sem impersonation". Uma sessão de console
347
+ * na mesma request continua ganhando.
348
+ */
349
+ bindBearerAccount(ctx, accountId) {
350
+ bindBearerAccount(ctx, accountId);
351
+ }
341
352
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adonis-agora/authkit-server",
3
- "version": "1.0.0-rc.15",
3
+ "version": "1.0.0-rc.16",
4
4
  "description": "AdonisJS OIDC/OAuth2 provider (Identity Provider) toolkit: ejectable auth server with sessions, rate-limiting, MFA/TOTP, audit log, federated logout and OpenTelemetry metrics.",
5
5
  "license": "MIT",
6
6
  "author": "dudousxd",
@@ -165,7 +165,7 @@
165
165
  "tempura": "0.4.1",
166
166
  "testcontainers": "12.2.1",
167
167
  "typescript": "7.0.2",
168
- "vite": "8.3.6"
168
+ "vite": "8.3.7"
169
169
  },
170
170
  "scripts": {
171
171
  "build": "node scripts/build_host_css.mjs && node scripts/build_webauthn.mjs && node scripts/build_ui.mjs && node -e \"const fs=require('node:fs');for(const d of ['build/stubs','build/host/views'])fs.rmSync(d,{recursive:true,force:true})\" && tsc && node -e \"require('node:fs').cpSync('src/host/assets','build/src/host/assets',{recursive:true})\" && node -e \"require('node:fs').cpSync('stubs','build/stubs',{recursive:true,filter:(s)=>!s.endsWith('.ts')})\" && node -e \"const fs=require('node:fs');if(fs.existsSync('assets'))fs.cpSync('assets','build/assets',{recursive:true})\" && node -e \"require('node:fs').cpSync('src/host/views','build/host/views',{recursive:true})\" && node -e \"const fs=require('node:fs');fs.mkdirSync('build/host/ui',{recursive:true});fs.readdirSync('src/host/ui').filter(f=>f.endsWith('.html')).forEach(f=>fs.copyFileSync('src/host/ui/'+f,'build/host/ui/'+f))\" && node -e \"require('node:fs').copyFileSync('commands/commands.json','build/commands/commands.json')\" && node -e \"const fs=require('node:fs');fs.mkdirSync('build/src/password',{recursive:true});fs.copyFileSync('src/password/common_passwords.txt','build/src/password/common_passwords.txt')\"",