Quick Start Guide
Get started with SIROS ID in minutes. This guide walks you through connecting your first application to verify digital credentials.
What You'll Build
By the end of this guide, you'll have:
- ✅ A working credential verification flow
- ✅ Users logging in with their digital credentials
- ✅ Verified identity claims in your application
Prerequisites
- An application with OIDC/OAuth2 login support
- Access to your IAM configuration (e.g., Keycloak, Auth0)
- A test wallet (we'll set this up)
Step 1: Get a Test Wallet (2 minutes)
You can use any OID4VCI/OID4VP-compatible wallet for testing. The simplest option is the SIROS ID Credential Manager:
- Open id.siros.org in your browser
- Create a new wallet using a passkey
- Navigate to Add Credential → Demo PID
- Accept the test Person Identification credential
You now have a wallet with a test credential.
The SIROS ID Verifier works with any OID4VP-compatible wallet. If you have an EUDI Reference Wallet or another compatible wallet, you can use that instead. The verification flow is identical.
Step 2: Register Your Application (5 minutes)
Register your application with a SIROS ID verifier:
# For self-hosted verifier:
curl -X POST https://verifier.example.org/register \
-H "Content-Type: application/json" \
-d '{
"client_name": "My Test App",
"redirect_uris": ["https://localhost:8080/callback"],
"token_endpoint_auth_method": "client_secret_post",
"grant_types": ["authorization_code"],
"response_types": ["code"],
"scope": "openid pid"
}'
The scope string lists every scope this client may request later (the default
is openid only). The scopes must exist on the verifier; pid is used here as
an example, see Requesting Specific Claims.
Save the returned client_id and client_secret.
When using the SIROS ID hosted service, services use subdomain-based multi-tenancy:
- Wallet:
https://id.siros.org/id/<tenant> - Verifiers:
https://<tenant>.verifier.id.siros.org - Issuers:
https://<tenant>.issuer.id.siros.org
For example, with tenant demo and verifier instance main:
curl -X POST https://main.demo.verifier.id.siros.org/register \
-H "Content-Type: application/json" \
-d '{ ... }'
Step 3: Configure Your IAM (5 minutes)
Add SIROS ID verifier as an identity provider:
Keycloak
- Go to Identity Providers → Add provider → OpenID Connect v1.0
- Configure:
- Alias:
sirosid - Display Name:
SIROS ID - Discovery URL:
https://verifier.example.org/.well-known/openid-configuration - Client ID: (from step 2)
- Client Secret: (from step 2)
- Client Authentication:
Client secret sent as post - Use PKCE: ON, method
S256(required for registered clients) - Default Scopes:
openid pid
- Alias:
- Save
Auth0
- Go to Authentication → Enterprise → OpenID Connect
- Create a new connection with:
- Issuer URL:
https://verifier.example.org - Client ID: (from step 2)
- Client Secret: (from step 2)
- Send the client credentials in the request body (not as HTTP Basic), and enable PKCE
- Issuer URL:
Direct Integration
If not using an IAM, redirect users directly:
// codeChallenge: base64url(SHA-256(codeVerifier)); keep the verifier for the token request
// Replace with your verifier URL
const authUrl = 'https://verifier.example.org/authorize?' +
new URLSearchParams({
response_type: 'code',
client_id: 'your-client-id',
redirect_uri: 'https://localhost:8080/callback',
scope: 'openid pid',
state: crypto.randomUUID(),
// PKCE is required for clients registered through /register
code_challenge: codeChallenge,
code_challenge_method: 'S256'
});
window.location = authUrl;
Step 4: Test the Flow (2 minutes)
- Start login: Click "Login with SIROS ID" in your app
- Scan QR code: Use your test wallet to scan the QR code
- Approve sharing: Review and approve the credential request
- Complete: You're logged in with verified claims!
What Just Happened?
/authorize pathThe "Verify signature & trust" step above is intended behaviour. Currently, a presentation that answers an OIDC /authorize session (QR code or same-device link) is posted to /verification/oidc-direct_post, which does not verify the SD-JWT VC or mdoc signature and does not ask the PDP about the issuer. The checks run on /verification/direct_post, used by the verifier's own page at /.
Known issue: https://github.com/SUNET/vc/issues/761
Your application received verified identity claims directly from the user's credential:
{
"sub": "unique-user-id",
"given_name": "Alice",
"family_name": "Smith",
"birthdate": "1990-01-15"
}
Requesting Specific Claims
Use scopes to request different credentials. There is no fixed scope list:
the scopes are the credential types the verifier operator configured
(scopes_supported in the discovery document lists them), and each must also be
in the scope you registered in step 2. For example, a verifier configured with
pid and ehic supports:
scope=openid pid ehic
Going to Production
- Register for production: Contact SIROS ID to get production credentials or deploy your own infrastructure
- Configure trust: Run an AuthZEN PDP such as go-trust and set
verifier.trust.pdp_url. A PDP is required for production; a verifier without one trusts every issuer and is for development and testing only - Update URLs: Point to your production verifier endpoint
Next Steps
- 📖 Full Verifier Guide – Complete verification documentation
- 🤝 Verifier Docker Quick Start – Run a verifier and go-trust with Docker Compose
- 🎫 Issuing Credentials – Issue your own credentials
- 🔐 Trust Services – Configure trust framework
- 🔧 Keycloak Integration – Detailed Keycloak setup
Common Issues
QR Code Not Scanning
- Ensure the wallet has camera permissions
- Try the deep link option for mobile browsers
Claims Not Appearing
- Check that requested scopes were registered for your client and exist on the verifier
- Verify the credential type in your wallet matches the request
Token Validation Fails
- Ensure your clock is synchronized (NTP)
- Check the JWKS endpoint is accessible
Get Help
- 📧 Email: support@siros.org
- GitHub: sirosfoundation