Skip to content

Fortified IDDocs

FortifiedID eID

Configuration reference for FortifiedID eID authentication with SD-JWT verifiable credentials

The FortifiedID eID authenticator lets a user log in by presenting an SD-JWT verifiable credential from the FortifiedID mobile eID app. Access acts as the verifier and the browser UI automatically chooses app-switch on mobile devices or QR code on desktop devices.

Common authenticator configuration can be found here.

The authenticator exposes the standard browser-side start, state, and cancel handlers. It also exposes public mobile endpoints under the authenticator context path so the eID app can fetch the proof request and post the signed presentation.

NameDescriptionDefault valueMandatory
base_pathBase path for the authentication flow.${globals.default_login_suffix}true
context_pathExternally reachable context path for this authenticator instance, used when building mobile request URLs if audience is not set.""false
base_urlExternally reachable Access base URL, used together with context_path if audience is not set.""false
audienceAudience value expected in the key-binding JWT and preferred external URL anchor for mobile endpoints.""true
accepted_issuerStatic issuer DID that this authenticator trusts. Use it as a fallback or additional allowlist entry during issuer key rotation.""false
required_claimsArray of claim names that must be disclosed in the presentation. All disclosed claims are stored in global state after successful authentication.[]false
required_vc_typeRequired SD-JWT VC type, matched against the credential vct claim.https://service.idombud.se/eid/review/credentials/eid/v1false
eid_server_base_urlBase URL for the eID server verifier-authorization endpoint.""false
eid_server_orgeID server organisation short name. Also exposed to the browser UI and mobile proof request.""false
verifier_client_idOAuth client identifier used when Access fetches verifier authorization from the eID server.""false
verifier_keystore_pathPath to the PKCS#12 keystore used to sign verifier request JWTs and authenticate against the eID server.""false
verifier_keystore_passwordPassword for verifier_keystore_path.""false
internal_http_destinationHTTP destination used for verifier authorization and, by default, status-list lookups.defaultfalse
issuer_auth_check_interval_msHow often Access checks whether cached verifier authorization should be refreshed.60000false
issuer_auth_early_refresh_msHow long before expiry the verifier authorization should be refreshed.60000false
issuer_display_nameDisplay name shown in the mobile app's identification request.""false
deeplink_schemeDeep link used to open the eID app on the user's device.idombud://AUTHENTICATEfalse
return_urlReturn URL sent to the mobile app in the deeplink.""false
success_locationOptional browser redirect location returned after successful authentication.""false
poll_frequencyBrowser polling interval in seconds while waiting for the mobile app.2false
allowed_polling_for_minutesMaximum time the browser and mobile session may remain pending.5false
session_store_sweep_interval_msInterval for removing expired pending mobile sessions from the in-memory session store. Set to 0 to disable the periodic sweep.60000false
qr_animated_enabledEnables animated QR data where the browser rotates the QR URL with timestamp and signature.truefalse
qr_animated_requiredRejects mobile request calls that do not include a valid animated QR timestamp and signature.falsefalse
qr_refresh_secHow often the browser should refresh animated QR data.1false
qr_window_secAccepted time window for animated QR values.10false
max_presentation_bytesMaximum accepted mobile presentation body size in bytes.65536false
max_presentation_attemptsMaximum number of presentation attempts for one pending session.3false
clock_skew_secondsAllowed clock skew when validating credential time claims.60false
kb_iat_window_secondsAllowed age of the key-binding JWT iat value.120false
require_expRequires the credential to contain an expiry time.truefalse
revocation_enabledEnables token status-list revocation checks.truefalse
status_list_http_destinationHTTP destination used when fetching token status lists.internal_http_destinationfalse
status_list_reload_interval_msHow long a cached token status list may be reused before Access reloads it.3600000false
status_list_cache_max_age_msMaximum accepted age for a cached token status list.43200000false
status_list_http_timeout_msTimeout for token status-list HTTP calls.5000false
require_credential_statusRejects credentials without a status-list reference when revocation is enabled.truefalse
verify_status_list_signatureVerifies the status-list JWT signature against the issuer key.truefalse
custom_identifierTag used for event separation.""false

When the browser starts authentication, Access creates a pending eID session and returns both a deeplink and QR data. Mobile and tablet users are sent to the eID app through the deeplink. Desktop users scan the QR code with the eID app.

The eID app fetches a signed proof request from Access, asks the user to present the matching credential, and posts the SD-JWT VC presentation back to Access. Access verifies the issuer, credential type, required claims, nonce, audience, key-binding JWT, expiry, and revocation status before completing the authentication.

Access does not expose internal verification codes to the browser. Failures such as an invalid signature, issuer, credential type, disclosure, key binding, nonce, audience, required claim, expiry, revocation, or unavailable status list are returned to the browser as AUTHENTICATION_FAILED.

User-driven states that require specific guidance remain distinct, including USER_CANCELLED and RATE_LIMITED. The internal error code and message are still written to system logging and event logging for troubleshooting.

The mobile app calls these endpoints directly under the authenticator context path.

Method Path Purpose
GET {context_path}/mobile/request?id={sessionId} Fetches the proof request, including nonce, audience, accepted issuers, required credential type, required claims, response URL, verifier request JWT, and verifier authorization JWT.
POST {context_path}/mobile/presentation?id={sessionId} Delivers the signed SD-JWT VC presentation in sdJwtPresentation.
DELETE {context_path}/mobile/presentation?id={sessionId} Cancels a pending session.

A mobile cancellation can also be sent as POST with header X-EID-Cancel: true. Cancellation requests must include X-Session-Binding-Token with the session nonce.

After a successful authentication, Access stores the claims disclosed by the credential presentation in global state. The exact set of stored keys depends on the claims requested in required_claims and on what the credential holder discloses. The key names match the claim names from the presentation, for example:

  • personalIdentifier
  • givenName
  • surname

Apart from system logging, event logging is done when starting, completing, failing, cancelling, or expiring a transaction.

Event ids are:

  • WEB_100030("FortifiedID eID authentication started")
    • IDENTIFIER (user trace id)
    • CUSTOMER_IDENTIFIER (if configured)
    • SOURCE_ADDRESS (ip of the remote session)
    • AUTHENTICATOR_IDENTIFIER (id and display name)
  • WEB_100031("FortifiedID eID authentication completed")
    • IDENTIFIER (user trace id)
    • CUSTOMER_IDENTIFIER (if configured)
    • SOURCE_ADDRESS (ip of the remote session)
    • AUTHENTICATOR_IDENTIFIER (id and display name)
    • givenName (if disclosed)
    • surname (if disclosed)
  • WEB_100032("FortifiedID eID authentication failed")
    • IDENTIFIER (user trace id)
    • CUSTOMER_IDENTIFIER (if configured)
    • SOURCE_ADDRESS (ip of the remote session)
    • AUTHENTICATOR_IDENTIFIER (id and display name)
    • MESSAGE (error code)
  • WEB_100033("FortifiedID eID authentication canceled or expired")
    • IDENTIFIER (user trace id)
    • CUSTOMER_IDENTIFIER (if configured)
    • SOURCE_ADDRESS (ip of the remote session)
    • AUTHENTICATOR_IDENTIFIER (id and display name)
    • MESSAGE (reason)