Environment & Setup
These steps are only required when self-hosting the wallet-server. You can skip this section if you deploy from Empeiria's One-Click Deployment Portal.
Prerequisites
Node.js 20+
Yarn 1.22.x (the repo pins
[email protected]viapackageManager)PostgreSQL 14+ (tested with 16.x)
Configuration (.env)
Create a .env file in the wallet-server root. Configuration is read from environment variables; the service validates the required ones at startup and refuses to boot if any are missing.
Required
DATABASE_URL— PostgreSQL connection string for the datastore, e.g.postgres://user:pass@localhost:5432/ssi.ISSUER_BASE_URL— public base URL under which this service serves OpenID4VCI issuer endpoints and credential offers. Any base URL works; by convention it ends with the protocol's path segment, e.g.https://issuer.example.com/oid4vci(andhttps://verifier.example.com/oid4vpfor the verifier URL below).VERIFIER_BASE_URL— public base URL under which this service serves OpenID4VP verifier endpoints. As with the issuer URL, a protocol path suffix is typically appended (e.g.https://verifier.example.com/oid4vp).
Authentication
Every non-public endpoint requires a valid OIDC JWT Bearer token (Authorization: Bearer <token>). Tokens are validated against a JWKS endpoint.
OIDC_JWKS_URL— JWKS endpoint used to verify access tokens (e.g. a Keycloak realm's.../protocol/openid-connect/certs). Required unlessAUTH_DISABLED=true.AUTH_DISABLED— set totruefor local development only. Every request is then treated as an authenticated admin, so no token is needed. Never enable this in production.
did:web hosting
The hostname for a did:web is supplied per request, in the required domain field of POST /agent/did/web (e.g. issuer.example.com, optionally with a port such as example.com:8080). There is no environment-variable fallback.
Hosted did:web documents are keyed by a generated UUID and served by this service over HTTPS at a fixed route; there is no configurable path prefix. See "did:web & Hosting" for path rules and examples.
Other
PORT— HTTP port (default3000).ALLOW_INSECURE_HTTP— set totrueto allow plain HTTP URLs during local development. OpenID4VC requires HTTPS in production, so leave this unset (orfalse) outside of local testing.NODE_ENV— when set toproduction, unhandled error messages returned to clients are replaced with a genericInternal server error; the real cause is only written to the logs.
Example
Install & Run
Swagger UI: http://localhost:<PORT>/api-docs OpenAPI JSON: http://localhost:<PORT>/api-docs-json
A global rate limit of 60 requests per 60 seconds applies (serving of DID documents is exempt).
Database
The datastore is PostgreSQL, configured through a single
DATABASE_URLconnection string.Database migrations run automatically at startup; no separate flag or command is required.
Stored data includes hosted DID documents, tenant signing keys, credential schemas, issuance and verification session state, and credentials held by cloud wallets.
did:web Hosting Notes
This service creates
did:webanddid:key(Ed25519) identifiers and serves thedid:webdocuments itself.A hosted
did:webdocument is served atGET /:uuid/did.json(and atGET /:uuid/.well-known/did.json), where:uuidis the identifier generated when the DID is created.The
did:webidentifier is built from thedomainsupplied in thePOST /agent/did/webrequest body plus a generated UUID, producing a DID of the formdid:web:issuer.example.com:<uuid>.See "did:web & Hosting" for path rules and examples.
Requirements
The wallet server runs as part of the EVDI SSI Core stack and shares its runtime requirements: Node.js 20 and PostgreSQL 16.
Last updated