Quickstart¶
Ten minutes, and the first five are reading.
1. Register your site¶
Open auth.omxus.com/developers, give
your site a name and its redirect URI, and leave with a client_id. Or do the
same in one call:
curl -s https://auth.omxus.com/oidc/register \
-H 'content-type: application/json' \
-d '{
"client_name": "My Site",
"redirect_uris": ["https://mysite.com/callback"],
"token_endpoint_auth_method": "client_secret_post"
}'
The answer carries client_id and, because this asks for a server-side
client, client_secret. The secret is shown once: only its hash is kept. Leave
out token_endpoint_auth_method for a browser app with no server; it then
gets no secret. Every field, rule and error: Registering a site.
The redirect URI is matched exactly: no wildcards, no trailing-slash forgiveness.
2. Point your auth library at the issuer¶
Ask for the profile scope: without it the token carries sub and nothing
else. PKCE is required for every client, with or without a secret.
providers: [{
id: 'omxus',
name: 'Omxus',
type: 'oidc',
issuer: 'https://auth.omxus.com',
clientId: process.env.OMXUS_CLIENT_ID,
clientSecret: process.env.OMXUS_CLIENT_SECRET,
checks: ['pkce', 'state'],
authorization: { params: { scope: 'openid profile' } },
}]
Untested: not run against a Next.js app.
import passport from 'passport';
import { discovery } from 'openid-client';
import { Strategy } from 'openid-client/passport';
const config = await discovery(
new URL('https://auth.omxus.com'),
process.env.OMXUS_CLIENT_ID,
process.env.OMXUS_CLIENT_SECRET);
passport.use('omxus', new Strategy(
{ config, scope: 'openid profile', callbackURL: 'https://mysite.com/callback' },
(tokens, done) => done(null, tokens.claims())));
openid-client 6. Discovery and the authorization URL were run against auth.omxus.com on 30 Oct 2026; the strategy adds PKCE on its own.
3. There is no step three¶
Send someone to sign in. The first time, they press once to let your site in; after that they come straight back with a session.
What you get back¶
The ID token, with scope openid profile:
{
"iss": "https://auth.omxus.com",
"sub": "23cf34129785242b1ea072ec3669a3af6af2528b",
"aud": "q3V8n0bX1kZ2mH7cT9wLpA",
"iat": 1793318400,
"exp": 1793322000,
"auth_time": 1793318395,
"omxus_address": "0xc6140a760bfbc99428a8e53a08546657fad14c76"
}
nonce is there too when you sent one. ID and access tokens last one hour.
sub is pairwise: use it, not the address
Each site gets a different sub for the same person, so two sites
cannot compare notes and discover they share a user. Key your own user rows
on sub. omxus_address is the person's public identity and is the same
everywhere, which is exactly why it is the wrong thing to key on.