What you gain
What stays the same
- Token families —
id_token,access_token_jwt, andaccess_tokenkeep 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_tokenaudience fromorigin:https://yourapp.comto your registeredclientId - Convex
domainconfig — stayshttps://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 yourorigin:https://yourapp.comclientId - Client secret — only if you choose a confidential client flow
https://yourapp.com/callback).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
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 theapplicationID in your auth.config.ts:
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_accessand persist the full token response. - After every refresh response, save the new
refresh_tokenimmediately (tokens can rotate). - Avoid parallel
refreshTokencalls from different components — use a single session layer (Ave Session) so refresh is single-flight. - For Convex, do not pass a stale
id_tokenstring tosetAuth— pass a function that returns a valid token (see Convex custom auth).
