/** * Token Endpoint — POST /oauth/token * * Who calls: Client (server-to-server). * * When: After getting the code (or for refresh). * * Purpose: Exchange authorization code + PKCE verifier for access token (and optional refresh token), or refresh an access token. */ /** * Typical parameter shapes * * /oauth/token (POST, application/x-www-form-urlencoded) * * For code exchange: grant_type=authorization_code, code, redirect_uri, client_id (and auth), code_verifier * * For refresh: grant_type=refresh_token, refresh_token, client_id (and auth) */ /** * Quick checklist (security & correctness) * - PKCE (S256) required for public clients (and basically for all). * - Use authorization code grant only (no implicit/hybrid). * - Rotate refresh tokens and bind them to client + user + scopes. * - Prefer private_key_jwt or mTLS for confidential clients. * - PAR + JAR recommended for higher security. * - Consider DPoP (proof-of-possession) to reduce token replay. * - Keep codes very short-lived (e.g., ≤60 s) and single-use. * - Publish discovery and JWKS, rotate keys safely. * - Decide JWT vs opaque access tokens; provide introspection if opaque. */ import { FlowBase, type FlowRunOptions } from '../../common'; declare const inputSchema: import("@frontmcp/lazy-zod").ZodObject<{ request: import("@frontmcp/lazy-zod").ZodObject<{}, import("zod/v4/core").$loose>; response: import("@frontmcp/lazy-zod").ZodObject<{}, import("zod/v4/core").$loose>; next: import("@frontmcp/lazy-zod").ZodOptional>; }, import("zod/v4/core").$strip>; declare const stateSchema: import("@frontmcp/lazy-zod").ZodObject<{ body: import("@frontmcp/lazy-zod").ZodOptional; client_id: import("@frontmcp/lazy-zod").ZodString; resource: import("@frontmcp/lazy-zod").ZodOptional; }, import("zod/v4/core").$strip>, import("@frontmcp/lazy-zod").ZodObject<{ grant_type: import("@frontmcp/lazy-zod").ZodLiteral<"authorization_code">; code: import("@frontmcp/lazy-zod").ZodString; redirect_uri: import("@frontmcp/lazy-zod").ZodString; client_id: import("@frontmcp/lazy-zod").ZodString; client_secret: import("@frontmcp/lazy-zod").ZodOptional; code_verifier: import("@frontmcp/lazy-zod").ZodString; }, import("zod/v4/core").$strip>, import("@frontmcp/lazy-zod").ZodObject<{ grant_type: import("@frontmcp/lazy-zod").ZodLiteral<"refresh_token">; refresh_token: import("@frontmcp/lazy-zod").ZodString; client_id: import("@frontmcp/lazy-zod").ZodString; client_secret: import("@frontmcp/lazy-zod").ZodOptional; }, import("zod/v4/core").$strip>], "grant_type">>; grantType: import("@frontmcp/lazy-zod").ZodOptional>; isDefaultAuthProvider: import("@frontmcp/lazy-zod").ZodBoolean; isOrchestrated: import("@frontmcp/lazy-zod").ZodBoolean; tokenResponse: import("@frontmcp/lazy-zod").ZodOptional; expires_in: import("@frontmcp/lazy-zod").ZodNumber; refresh_token: import("@frontmcp/lazy-zod").ZodOptional; scope: import("@frontmcp/lazy-zod").ZodOptional; }, import("zod/v4/core").$strip>>; error: import("@frontmcp/lazy-zod").ZodOptional; errorDescription: import("@frontmcp/lazy-zod").ZodOptional; }, import("zod/v4/core").$strip>; declare const outputSchema: import("@frontmcp/lazy-zod").ZodObject<{ kind: import("@frontmcp/lazy-zod").ZodLiteral<"json">; status: import("@frontmcp/lazy-zod").ZodNumber; body: import("@frontmcp/lazy-zod").ZodUnion, import("@frontmcp/lazy-zod").ZodArray, import("@frontmcp/lazy-zod").ZodRecord]>; contentType: import("@frontmcp/lazy-zod").ZodDefault; headers: import("@frontmcp/lazy-zod").ZodOptional]>]>>>>; cookies: import("@frontmcp/lazy-zod").ZodOptional; domain: import("@frontmcp/lazy-zod").ZodOptional; httpOnly: import("@frontmcp/lazy-zod").ZodDefault; secure: import("@frontmcp/lazy-zod").ZodOptional; sameSite: import("@frontmcp/lazy-zod").ZodOptional>; maxAge: import("@frontmcp/lazy-zod").ZodOptional; expires: import("@frontmcp/lazy-zod").ZodOptional; }, import("zod/v4/core").$strip>>>>; }, import("zod/v4/core").$strip>; declare const plan: { readonly pre: ["parseInput", "validateInput"]; readonly execute: ["handleAuthorizationCodeGrant", "handleRefreshTokenGrant", "handleAnonymousGrant", "buildTokenResponse"]; readonly post: ["validateOutput"]; }; declare global { interface ExtendFlows { 'oauth:token': FlowRunOptions; } } declare const name: "oauth:token"; export default class OauthTokenFlow extends FlowBase { private logger; parseInput(): Promise; validateInput(): Promise; handleAuthorizationCodeGrant(): Promise; handleRefreshTokenGrant(): Promise; handleAnonymousGrant(): Promise; buildTokenResponse(): Promise; validateOutput(): Promise; } export {}; //# sourceMappingURL=oauth.token.flow.d.ts.map