User applications
authorization_code with S256 PKCE and optional refresh_token.
API reference
Configure clients from the tenant discovery document. The issuer host is part of the security boundary: clients, authorizations, signing keys, consent, and passkeys are selected for that issuer.
Replace the host with the tenant issuer selected for the application.
https://free.openissuer.com/issuer/.well-known/openid-configurationIssuer endpoints
The public base URL is https://TENANT_HOST/issuer. The gateway strips /issuer before forwarding requests to the authorization server.
/.well-known/openid-configurationIssuer metadata and supported protocol capabilities./oauth2/authorizeStarts authorization-code login and consent./oauth2/tokenExchanges codes, refresh tokens, or client credentials./oauth2/jwksPublic signing keys used to validate JWTs./userinfoReturns claims authorized for the current OpenID Connect user./connect/logoutStarts OpenID Connect relying-party initiated logout.Client registration
authorization_code with S256 PKCE and optional refresh_token.
client_credentials with a client authentication method assigned during registration.
openid profile email plus application scopes such as message.read.
Discovery reports server capabilities. A client can use only the grants, authentication methods, redirect URIs, and scopes stored in its own registration.
Authorization code
GET https://free.openissuer.com/issuer/oauth2/authorize
?response_type=code
&client_id=CLIENT_ID
&redirect_uri=https%3A%2F%2Fapp.example.com%2Fapi%2Fauth%2Fcallback%2Fmyauth
&scope=openid%20profile
&state=RANDOM_STATE
&nonce=RANDOM_NONCE
&code_challenge=BASE64URL_SHA256_VERIFIER
&code_challenge_method=S256Generate and validate state, nonce, and the PKCE verifier with a maintained OAuth/OIDC client library rather than constructing the flow manually.
Token exchange
curl -X POST https://free.openissuer.com/issuer/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "CLIENT_ID:CLIENT_SECRET" \
-d "grant_type=authorization_code" \
-d "code=AUTHORIZATION_CODE" \
-d "redirect_uri=https://app.example.com/api/auth/callback/myauth" \
-d "code_verifier=PKCE_VERIFIER"Confidential clients commonly use client_secret_basic. Public clients omit the secret and must be registered with no client authentication method and required PKCE.
Claims
{
"iss": "https://free.openissuer.com/issuer",
"sub": "user@example.com",
"aud": "CLIENT_ID",
"tenant_id": "free.openissuer.com",
"name": "Example User",
"email": "user@example.com",
"picture": ""
}{
"iss": "https://free.openissuer.com/issuer",
"sub": "user@example.com",
"scope": ["openid", "profile"],
"tenant_id": "free.openissuer.com",
"userId": "USER_UUID",
"userRole": ["ROLE_NAME"],
"authFactors": ["FACTOR_PASSWORD"]
}Claims depend on principal type, granted scopes, roles, and completed authentication factors. Optional claims may be absent.
Troubleshooting
invalid_clientinvalid_grantinvalid_scope