Skip to main content
RFC in practice — remote, loopback, PKCE, rotating refresh. Fast path: Quick Start.
For building the flow from scratch or with an OAuth library. Overview: Building a client. Notifique runs OAuth 2.1 with mandatory PKCE on every authorization code exchange, plus Dynamic Client Registration (DCR) at POST /oauth/register. Issuer: https://api.notifique.dev. Login and consent live in the Notifique dashboard. Your app opens the authorize URL in the browser and handles the callback — you do not build consent UI.

Client types

PKCE is always required — even for confidential clients.
  1. Fixed registration vs DCR — pre-register known apps; use DCR at runtime for MCP/CLI when redirect/port is unknown upfront.
  2. Remote vs local — HTTPS callback with server session vs loopback http://127.0.0.1:<port>/callback.

Scopes

Declare the minimum at registration and authorize. See Scopes.

Request encoding

Confidential clients use HTTP Basic (client_id:client_secret) on token/revoke.

Generating PKCE and state

Remote: persist state and codeVerifier in the user session before redirect. Local: keep in memory while the loopback server runs.

Pre-registered remote client

Fixed HTTPS redirect, e.g. https://example.com/oauth/callback. Register as confidential. Store client_secret securely — shown once. Treat missing code, mismatched state, or error query params as failures.

Local client (loopback)

Public client, bind 127.0.0.1 or [::1] — never 0.0.0.0.
Do not prefetch /oauth/authorize server-side. The user must see the consent screen in a browser.
Close the loopback server after success or timeout.

Rotating refresh tokens

Each successful refresh returns a new refresh_token. The old one stops working.
Serialize refresh per grant. Persist the new refresh atomically. Parallel workers refreshing the same old token can revoke the entire grant.

Call /v1 with the access token

JWT (~15 min, EdDSA). Optional offline validation via GET /.well-known/jwks.json.

Revoke access

Revoke the refresh token — JWT access tokens are not individually revocable.
Workspace: Settings → Team → Connected apps.

Next steps