What you gain
| Feature | Quick Ave | Standard Ave |
|---|---|---|
| Refresh tokens | ❌ | ✅ (request offline_access scope) |
| App branding on consent screen | ❌ | ✅ |
| Confidential client (client secret) | ❌ | ✅ |
| Connector delegation (app-to-app) | ❌ | ✅ |
| E2EE app-key delivery | ❌ | ✅ |
| Custom token TTLs | ❌ | ✅ |
offline_access scope | ❌ | ✅ |
| Longer-lived sessions | ❌ (1 hour, no refresh) | ✅ |
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
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).Replace startQuickSignIn with startPkceLogin
startPkceLogin works the same way as startQuickSignIn — it generates PKCE params, stores them in sessionStorage, and redirects to Ave.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.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: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
| Quick Ave | Standard Ave | Notes |
|---|---|---|
startQuickSignIn() | startPkceLogin(config) | Pass clientId + redirectUri |
handleQuickCallback() | exchangeCode(config, { code, codeVerifier }) | You manage the session |
getQuickIdentity() | Your own session store | Use the user field from TokenResponse |
clearQuickIdentity() | Clear your session + optionally redirect | No SDK call needed |
startQuickSessionMonitor() | Periodic refresh token check | Use refreshToken() on a timer |
user.token | tokens.access_token_jwt | Ave API access JWT; not your app login token |
user.idToken | tokens.id_token | Same OIDC token, aud changes to your clientId |
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).
