Migrating from 5.x to 6.0
This guide covers breaking changes introduced in EUDIPLO v6.0 and the required migration steps from any 5.x version.
:::warning Back up before upgrading Always back up your database and your assets/config directory before performing a major version upgrade. :::
Summary of Breaking Changes
| Area | Change | Impact |
|---|---|---|
| Issuance Authorization Servers | Legacy authServers/chainedAs approach is replaced by unified authorizationServers entries (external, oid4vp, chained, built-in) | High |
| Credential Offer by Reference | credential_offer_uri (offer-by-reference) is now single-use and cannot be resolved repeatedly | Medium |
| Refresh Token Policy | Refresh-token settings moved from top-level issuance config to authorizationServers[].token | Medium |
| Pre-Authorized Offer Routing | Pre-authorized issuance flow defaults to built-in AS when no authorization_server is explicitly selected | Low |
1. Issuance Authorization Server Model (Breaking)
What Changed
Issuance authorization server configuration moves to a unified authorizationServers model.
Legacy configuration keys:
- authServers
- chainedAs
must be migrated to typed entries in:
- authorizationServers[]
with type set to one of:
- external
- oid4vp
- chained
- built-in
The authorizationServers array must contain at least one entry.
Before (5.x)
{
"authServers": ["https://auth.example.com"],
"chainedAs": {
"enabled": true,
"upstream": {
"issuer": "https://keycloak.example.com/realms/eudiplo",
"clientId": "eudiplo-chained-as",
"clientSecret": "secret"
},
"token": {
"lifetimeSeconds": 3600,
"signingKeyId": "default"
},
"requireDPoP": true
}
}
After (6.0)
{
"authorizationServers": [
{
"type": "external",
"id": "external-corp-idp",
"issuer": "https://auth.example.com"
},
{
"type": "chained",
"id": "chained-auth",
"enabled": true,
"upstream": {
"issuer": "https://keycloak.example.com/realms/eudiplo",
"clientId": "eudiplo-chained-as",
"clientSecret": "secret",
"scopes": ["openid", "profile", "email"]
},
"token": {
"lifetimeSeconds": 3600,
"signingKeyId": "default"
},
"requireDPoP": true
},
{
"type": "oid4vp",
"id": "pid-auth",
"presentationConfigId": "pid-no-hook",
"enabled": true
}
]
}
Authorization Server IDs
Each authorizationServers[] entry must define an id:
- non-empty string
- unique across the array
- values
built-inandchained-asare reserved
For offer requests, authorization_server must contain one of these configured ids.
Migration Steps
- Replace authServers URLs with authorizationServers entries of type external.
- Replace chainedAs object with one authorizationServers entry of type chained.
- If you use VP-backed AS routing, define authorizationServers entries of type oid4vp with stable id values.
- Update offer creation payloads so
authorization_serverreferences a configured ASid. - Re-run OIDF and wallet integration tests to validate authorization server selection and metadata behavior.
2. Credential Offer URI Is Single-Use (Behavioral Change)
What Changed
When using offer-by-reference (credential_offer_uri), the referenced offer can now be consumed only once.
After the first successful wallet resolution, subsequent attempts to resolve the same URI are expected to fail.
Impact
- Wallet retry flows that re-fetch the same
credential_offer_uriwill no longer work. - Integrations that shared one URI across multiple devices/sessions must now issue one offer per consumption.
Migration Steps
- Ensure each wallet/user session gets its own freshly generated
credential_offer_uri. - If a flow fails mid-journey, generate a new offer instead of retrying the old URI.
- Update automated tests to assert that a second resolve attempt on the same URI is rejected.
3. Refresh Token Policy Moved Under Authorization Servers
What Changed
Refresh-token behavior is no longer configured via legacy issuance-level refresh-token fields.
Configure refresh-token policy per authorization server in:
authorizationServers[].token.refreshTokenEnabledauthorizationServers[].token.refreshTokenExpiresInSeconds
Built-in AS defaults remain:
refreshTokenEnabled: truerefreshTokenExpiresInSeconds: 2592000(30 days)
Migration Steps
- Remove any reliance on legacy top-level refresh-token flags in issuance config.
- Add explicit
tokensettings to each managed authorization server where you need non-default refresh-token behavior. - Validate token endpoint behavior for both
authorization_codeandrefresh_tokengrant types after upgrade.
4. Pre-Authorized Flow Defaults to Built-In AS
What Changed
For pre-authorized code offers, when authorization_server is omitted, EUDIPLO now defaults routing to the built-in authorization server.
Migration Steps
- If you require a specific AS (for example
chainedoroid4vp), setauthorization_serverexplicitly in offer creation. - Re-test pre-authorized wallet flows that previously depended on implicit AS selection behavior.