Overview
Ver.iD Issuance uses the OAuth authorization code flow with PKCE. The OAuth scope is issuance.
Use issuance when your application needs to place a credential in a customer's digital identity wallet. Studio defines the credential structure. Your server supplies the values for one customer through an issuance intent.
Before you start
Create and activate an issuance in Ver.iD Studio. The configuration must contain:
- At least one supported digital identity wallet.
- The credentials and attributes that can be issued.
- An exact redirect URI for your application.
- An issuance mapping, or the UUIDs of all configured attributes.
- An OAuth client secret for the server integration.
Copy the issuer URI and client identifier from the active issuance's Configuration tab. Use the key from an OAuth secret attached to the issuance as the client secret. The SDK uses the issuer URI to discover the authorization, token, intent, and signing-key endpoints.
Studio configuration and intents
Studio configuration defines what can be issued. It includes the digital identity wallets, credentials, attributes, redirect URIs, brands, mappings, and consent information.
The intent defines one issuance run and supplies its credential values. Issuance always requires an intent. You cannot create an issuance URL without its intent_id.
Creating the intent also returns an issuance_run_uuid. Store this identifier with your business transaction so the run and its final result can be correlated.
The intent must contain exactly one payload form:
- A
mappingobject whose keys match an active issuance mapping. - A
dataarray containing an attribute UUID and value for every configured attribute.
Use one format only. Do not send mapping and data together.
| Payload form | When to use it |
|---|---|
payload.mapping | Your application has business field names that are mapped to credential attributes in Studio. This is the preferred option for most integrations. |
payload.data | Your application supplies every value by its configured attribute UUID. Use this when no mapping is attached. |
All required credential values must be present. The intent cannot add credentials or attributes that are not part of the active Studio configuration.
The intent can also control settings for this run:
| Intent setting | Purpose |
|---|---|
challenge | Associates a challenge UUID from your application with this run. |
brandUuid | Selects an active brand attached to the issuance. |
requireExplicitConsent | Overrides the configured consent setting for this run. |
These settings do not change the active Studio configuration.
Flow
- Your server validates the values that will be placed in the credential.
- Your server creates a random
state, a PKCE code verifier, and anS256code challenge. - Your server creates an intent through the discovered
intent_endpoint. It sends the credential payload, code challenge, and client secret. - Ver.iD returns an
intent_idand anissuance_run_uuid. - Your server creates an authorization URL with the
issuancescope, registered redirect URI,state, code challenge, andintent_id. - Your application redirects the customer to Ver.iD. The customer selects a digital identity wallet and reviews the credential.
- The digital identity wallet accepts and stores the credential.
- Ver.iD returns the customer to the registered redirect URI with an authorization code and the original
state. - Your server confirms the returned
stateand exchanges the code with the matching PKCE verifier and client secret. - Ver.iD returns a signed issuance result as the
access_token. Your server verifies and decodes it before recording the outcome.
Issuance result
The issuance access token is a signed result JWT. It contains the issuanceRunUuid and output for the completed digital identity wallet interaction. The output records the credential and attribute identifiers, their values, and their issuance status.
Use the run UUID to connect this result to the intent created by your application. Verify the JWT before trusting any result or status.
Production security
Production issuance uses a confidential server-side client. Use @ver-id/node-client to create the intent, generate the authorization URL, finalize the callback, and verify the result.
- Keep the client secret and PKCE verifier outside browser code.
- Confirm
statebefore exchanging the authorization code. - Validate and authorize credential values before creating the intent.
- Do not write credential values or result tokens to application logs.
- Use shared storage for
stateand PKCE data when the application runs on multiple server instances. - Use
decodewithassertIssuanceV1JwtPayloadbefore reading the result.
See Start an issuance for the complete SDK example.
Supported protocol
| Feature | Supported value |
|---|---|
| OAuth scope | issuance |
| Response type | code |
| Grant type | authorization_code |
| PKCE method | S256 |
| Intent | Required |
| Client type | Confidential server-side client |
| Result | Signed issuance JWT in access_token |