access_mode = "accounts", floo provides a hosted OAuth flow powered by WorkOS. Your app’s users can sign in with email, Google, GitHub, and more — no auth infrastructure to build.
Quickstart
This is the exact sequence. Each step depends on the previous one.Domain naming convention
Your app’s public URL follows this pattern:| Environment | Domain |
|---|---|
| dev | <app-name>-dev.on.getfloo.com |
| production | <app-name>.on.getfloo.com |
Example config
git push (or floo redeploy). The auth endpoints are live as soon as the deploy completes. No separate WorkOS account is needed — floo manages this for you.
OAuth flow
All auth endpoints are underhttps://api.getfloo.com/v1/auth/apps/{app_id}.
1. Start login
Redirect your user’s browser to:redirect_uri must exactly match one of the URIs registered in your [auth] config — including the protocol, host, port, and path.
2. Handle the callback
After the user authenticates, floo redirects back to yourredirect_uri with a one-time exchange code:
3. Exchange code for tokens
From your backend, exchange the code for an access token and refresh token:4. Verify the JWT
Theaccess_token is an RS256-signed JWT. You can verify it locally using the public keys:
| Claim | Description |
|---|---|
sub | app user ID (UUID) |
email | user’s email address |
name | user’s display name |
iss | https://auth.getfloo.com |
aud | your app ID |
iat | issued at |
exp | expiration |
5. Refresh tokens
When the access token expires, use the refresh token to get a new one:6. Logout
Revoke the refresh token when the user logs out:Convenience endpoint
If you don’t want to decode the JWT yourself, use the session endpoint:Constructing redirect URIs in your app
Your app needs to generate the correctredirect_uri when starting the login flow. Behind floo’s edge proxy, your app receives the public hostname in the X-Forwarded-Host header.
Node.js / Express:
Troubleshooting
INVALID_REDIRECT_URI
The redirect URI your app sends to the authorize endpoint must exactly match one of the URIs in your[auth] redirect_uris config. Common causes:
- Wrong hostname — dev deploys use
<app>-dev.on.getfloo.com, not<app>.on.getfloo.com - Wrong protocol — deployed apps must use
https://, nothttp:// - Trailing slash mismatch —
/callbackis not the same as/callback/ - Not yet deployed — redirect URI changes in
floo.app.tomlonly take effect after a deploy
NO_REDIRECT_URIS
You setaccess_mode = "accounts" but didn’t add [auth] redirect_uris in your config, or you haven’t deployed since adding them.
Access modes
| Mode | Description | Plan | Best for |
|---|---|---|---|
public | No auth, anyone can access | All | Marketing sites, open APIs |
password | Shared app password | Pro+ | Private demos, client previews |
accounts | Per-user auth via hosted OAuth | Pro+ | Apps with named end users |
sso | Enterprise SSO via SAML/OIDC (coming soon) | Enterprise | Enterprise apps |
Password-protected apps
Environment overrides
Override access mode per environment:[environments.dev].access_mode wins over [app].access_mode.
Config File Spec
Full reference for all config fields and precedence.
Team Access
Org membership, invites, and permissions.