1. Register the project
Sign in to Console and choose Create project. Have these ready:- Auth0
- Supabase
- Other
- Auth0 domain: your tenant or custom domain, such as
https://example.us.auth0.com. - Connection name: such as
versine. You’ll use the same name in Auth0. - Callback URL: that domain followed by
/login/callback, exactly.
Set up with a coding agent
Set up with a coding agent
Choose Use my AI assistant when creating the project. Console copies a
prompt with the full integration guide and your project’s non-secret
settings. Paste it into your coding agent with your repository open. Enter
secrets into your auth provider and secret manager yourself.
Terms of Service and Privacy Policy
Terms of Service and Privacy Policy
Under Advanced, optionally add your Terms of Service and Privacy Policy
URLs. Versine gives them to assistants, which decide how to show them to
their users. Versine doesn’t record acceptance: if you need a record, ask
for it in your product after sign-in. Leave both empty to skip this.
2. Connect your auth provider
- Auth0
- Supabase
- Other
In Auth0, open Authentication → Enterprise → OpenID Connect and create a connection:
- Name: the connection name from step 1.
- Discovery URL:
https://auth.versine.com/.well-known/openid-configuration. - Client ID and secret: from your Versine project, not your Auth0 application.
- Type: Back Channel, with
client_secret_basicauthentication. - Scopes:
openid profile email phone. - PKCE: S256.
Security profiles
Security profiles
Keep S256 PKCE, the default, unless Auth0 can’t use it on this connection.
Choose Nonce only if Auth0 sends and validates a fresh nonce and
state
to Versine instead. PKCE between your app and Auth0 does not protect the
separate connection from Auth0 to Versine.3. Add the sign-in button
Add Are you an agent? to both your login and sign-up pages. Keep your existing sign-in options.- Auth0
- Supabase
- Other
Point the button at Auth0’s login with your Versine connection:If you use one of Auth0’s server-side SDKs instead, such as
@auth0/nextjs-auth0, pass connection=versine as an authorization parameter to its login route. Let Auth0’s SDK handle state, nonce and PKCE.4. Connect user accounts
Versine sends:subis stable for one person, through one assistant, on your platform. The same person signing in through a different assistant has a differentsub.email_verifiedistrueonly if the assistant proved the person controls the mailbox in the last year.email_verificationsays how and when:provider_sso(signed in through Google, Apple or Microsoft) orotp(a one-time code or link).phone_number_verifiedistrueonly if the assistant proved the person has the number in the last 30 days.phone_verificationsays how and when:messaging(the person messages the assistant from that number) orotp.- A sign-in can have an email, a phone number or both. People who use an assistant only by text message may have no email.
- Auth0
- Supabase
- Other
Auth0 creates a separate user for each connection, with an ID such as
oidc|versine|<sub>. Identify users by that ID. To reach an existing
account, link the users in a post-login Action keyed to the Versine
connection, following the table above. For an unverified email, redirect
to a step where the person verifies it first. See
Auth0 account linking.Auth0 doesn’t store the phone number by default. In the connection’s
attribute mapping, map phone_number and phone_number_verified from the
ID token. Add them to your app’s tokens in the post-login Action if your app
needs them there.Identify agent sign-ins
Identify agent sign-ins
Versine adds Treat this as where the sign-in came from, not as a role or permission.
https://versine.com/claims/provider: "versine" and the
assistant’s ID to its ID token and userinfo. Many auth providers,
including Auth0 and Supabase, don’t forward these claims into your app’s
tokens.- Auth0
- Supabase
- Other
Set the source in a post-login Action keyed to the Versine connection:To use the assistant ID in your app, map the upstream claim through the
connection’s attribute mapping and a reviewed Action.
Decide what agents can do
Decide what agents can do
Agree which reads, writes and resources agents may use, and which actions
need a person, such as billing, admin and deletion. Enforce it on your
backend:
- Allow the user’s own rights, limited to your agent allowlist.
- Keep the sign-in source in your server session, not in client parameters.
- Treat a missing source as an agent, not a person.
- Keep restrictions through refresh, silent sign-in and account linking.
5. Choose assistants
In Console, open Configuration → Assistants. By default your project accepts every assistant Versine has reviewed, including ones added later. Choose Only selected assistants to accept a fixed list instead. An agent from an assistant you don’t accept, or one that doesn’t work with Versine, sees a page saying agent sign-in isn’t available. It can’t sign in through Versine.Allow code sign-in
Allow code sign-in
Some agents drive a browser that can’t add the sign-in header, such as an
agent controlling a person’s desktop. With Advanced → Allow code sign-in
on, Versine’s page asks these agents for a code from their assistant, which
they type in. Each code works once, on one sign-in page, for two minutes.It’s off by default because the code passes through the agent itself. An
agent tricked into revealing its code could let someone else sign in as its
user. Turn it on only if you need these agents, and keep agent permissions
tight.
6. Test sign-in
In Console, open Test sign-in and enter your app’s login page. Versine opens it in a browser that acts as a test assistant, clicks Are you an agent? and signs in as the test person you choose:- New person: confirm an account is created. Test again and confirm the same account is used.
- Existing email, verified: confirm the sign-in reaches that account.
- Existing email, not verified: confirm your app asks for proof before linking, and creates no duplicate.
- Phone number only: confirm your app creates or finds an account with no email.
- Ask an agent from a supported assistant to sign in, and confirm it reaches a protected page.
- Sign out and confirm access is denied.
Troubleshoot a failed sign-in
Troubleshoot a failed sign-in
Check these first:
invalid_redirect_uri: match the project’s callback to your provider’s exactly, with no query.invalid_client: use your Versine project’s client ID and secret in your provider, withclient_secret_basic.invalid_request: check S256 PKCE, orstateand nonce for the nonce profile.- The agent sees Agent sign-in isn’t available: its assistant isn’t in your accepted list or doesn’t work with Versine.
- The agent is asked for a sign-in code you didn’t expect: its browser didn’t send a sign-in token and code sign-in is on. Turn it off if you don’t need it.
- Supabase returns
provider_email_needs_verification: the email isn’t verified. The person confirms it from Supabase’s email, then the agent signs in again.
