Skip to main content
Quick Ave and the standard OIDC flow use the same token families, JWKS endpoint, and OIDC discovery URL. Upgrading is mostly a matter of swapping a few function calls and registering an app in the developer portal.

What you gain

What stays the same

  • Token families — id_token, access_token_jwt, and access_token keep the same roles
  • OIDC discovery: https://aveid.net/.well-known/openid-configuration
  • JWKS endpoint: https://aveid.net/.well-known/jwks.json
  • Claims (sub, iss, aud, name, email, etc.) — same meaning in both flows
  • Backend JWT validation shape — update the expected id_token audience from origin:https://yourapp.com to your registered clientId
  • Convex domain config — stays https://aveid.net

Upgrade steps

1

Register an app in the developer portal

Go to devs.aveid.net and create an OAuth app. You’ll receive:
  • Client ID (e.g. app_xxxx) — replaces your origin:https://yourapp.com clientId
  • Client secret — only if you choose a confidential client flow
Register the exact callback URL you plan to use (e.g. https://yourapp.com/callback).
You can keep using PKCE without a client secret — just register the app and get a clientId. The confidential client option is only needed if you want server-side token exchange with a secret.
2

Replace startQuickSignIn with startPkceLogin

startPkceLogin works the same way as startQuickSignIn — it generates PKCE params, stores them in sessionStorage, and redirects to Ave.
3

Replace handleQuickCallback with finishPkceLogin

Unlike handleQuickCallback, finishPkceLogin returns the full TokenResponse instead of a QuickIdentity — you manage your own session from here. State verification and token validation happen automatically, just like they did in Quick Ave.
4

Replace getQuickIdentity with your own session management

Quick Ave stored the identity in localStorage automatically. With Standard Ave, you decide how to store and serve the session:
5

Add refresh token handling

This is what you gain. With offline_access in your scope, you can silently refresh without re-authenticating the user:

Updating Convex

If you’re using Convex, the only change is the applicationID in your auth.config.ts:
Everything else — the fetchAccessToken implementation, Convex function auth, the JWKS endpoint — stays the same.
The id_token from a Standard Ave app has aud: "app_xxxx" instead of aud: "origin:https://yourapp.com". Convex validates aud against applicationID, which is why you update applicationID when you upgrade.

Quick reference: function mapping

If you still get logged out with offline_access

Quick Ave never gives a refresh token — sessions are bounded by access token TTL (~one hour by default). After upgrading to a registered app:
  • Request openid profile email offline_access and persist the full token response.
  • After every refresh response, save the new refresh_token immediately (tokens can rotate).
  • Avoid parallel refreshToken calls from different components — use a single session layer (Ave Session) so refresh is single-flight.
  • For Convex, do not pass a stale id_token string to setAuth — pass a function that returns a valid token (see Convex custom auth).
Last modified on May 23, 2026