Let people sign in to your app with their Arcnode account. Backboard is a standard OAuth 2.0 and OpenID Connect provider using the Authorization Code flow with PKCE.
Base URL: https://backboard.arcnode.dev. Discovery is machine readable, so most OIDC libraries only need the issuer URL.
openidRequired for OpenID Connect. Returns an id_token and a stable sub.profileGrants access to the account display name.emailGrants access to the account email address.PKCE is mandatory and only the S256 method is accepted. Generate a random code_verifier, then derive the challenge.
// code_verifier: 43-128 chars from [A-Za-z0-9-._~]
const verifier = base64url(crypto.getRandomValues(new Uint8Array(32)))
// code_challenge = base64url(SHA-256(verifier))
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier))
const challenge = base64url(new Uint8Array(digest))Send the user to the authorization endpoint. The redirect_uri must exactly match one you registered. Keep the state and verifier in the user session.
GET https://backboard.arcnode.dev/oauth/authorize ?response_type=code &client_id=YOUR_CLIENT_ID &redirect_uri=https://app.example.com/callback &scope=openid%20profile%20email &state=RANDOM_STATE &nonce=RANDOM_NONCE &code_challenge=CHALLENGE &code_challenge_method=S256
Arcnode shows a consent screen. On approval the user is returned to your redirect_uri with ?code=...&state=.... Verify state matches before continuing.
Confidential clients authenticate with their client_secret (HTTP Basic or in the body). Public clients (for example SPAs) omit the secret and rely on PKCE. Always send the code_verifier.
POST https://backboard.arcnode.dev/oauth/token Content-Type: application/x-www-form-urlencoded Authorization: Basic base64(client_id:client_secret) // confidential only grant_type=authorization_code &code=THE_CODE &redirect_uri=https://app.example.com/callback &code_verifier=THE_VERIFIER &client_id=YOUR_CLIENT_ID
200 OK
{
"access_token": "eyJhbGciOiJSUzI1Ni...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "openid profile email",
"id_token": "eyJhbGciOiJSUzI1Ni...",
"refresh_token": "..."
}Tokens are RS256 JWTs. Verify them against the keys at /.well-known/jwks.json with issuer https://backboard.arcnode.dev and audience equal to your client_id.
Call userinfo with the access token to read the claims your scopes allow.
GET https://backboard.arcnode.dev/oauth/userinfo
Authorization: Bearer ACCESS_TOKEN
200 OK
{ "sub": "user_id", "email": "you@example.com", "email_verified": true, "name": "Your Name" }Access tokens live for one hour. Use the refresh token to get a new one. Refresh tokens rotate: each use returns a new refresh token and invalidates the old one.
POST https://backboard.arcnode.dev/oauth/token Content-Type: application/x-www-form-urlencoded grant_type=refresh_token &refresh_token=THE_REFRESH_TOKEN &client_id=YOUR_CLIENT_ID
Secured by Arcnode identity