You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit e747a93
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/sirosid/issuers/api-integration.md
+19-21Lines changed: 19 additions & 21 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -426,19 +426,19 @@ apigw:
426
426
427
427
### Credential Offer Format
428
428
429
-
The deep link contains a credential offer with pre-authorized code grant:
429
+
The offer carries a pre-authorized code grant. `credential_configuration_ids` holds the credential **scope** (here `diploma`), and the offer is valid for 5 minutes. The `tx_code` object is present only when `enable_pin` is on:
"description": "Enter the PIN provided by the issuer"
442
442
}
443
443
}
444
444
}
@@ -449,21 +449,9 @@ The deep link contains a credential offer with pre-authorized code grant:
449
449
450
450
## Revocation
451
451
452
-
Credential revocation is managed via [Token Status Lists](/sirosid/reference/token-status-lists). When a credential needs to be revoked, delete the underlying document and the issuer updates the status list entry:
452
+
Credential status is published as [Token Status Lists](/sirosid/reference/token-status-lists) by the registry service. Deleting a document through `DELETE /api/v1/datastore` removes the stored document so no further credentials can be issued from it, but it does **not** change the status of credentials that were already issued: apigw never calls the registry to update a status.
453
453
454
-
```bash
455
-
DELETE /api/v1/datastore
456
-
Content-Type: application/json
457
-
Authorization: Bearer <your-jwt-token>
458
-
459
-
{
460
-
"authentic_source": "hr.example.org",
461
-
"scope": "diploma",
462
-
"document_id": "diploma-2025-001234"
463
-
}
464
-
```
465
-
466
-
Verifiers checking the Token Status List will see the credential as revoked.
454
+
To revoke an issued credential, update its status entry in the registry, either through the registry admin GUI (`registry.admin_gui`, `POST /admin/status`) or by calling the registry's `TokenStatusListUpdateStatus` gRPC method directly. Verifiers checking the Token Status List then see the credential as revoked.
The generated Go stubs live under `internal/`in the [vc repository](https://github.com/SUNET/vc) and cannot be imported from other modules; generate your own client from `proto/v1-issuer.proto`. The gRPC server listens on `issuer.grpc_server.addr` (default `:8090`).
505
+
511
506
```go
512
507
import (
513
508
"google.golang.org/grpc"
514
-
pb "vc/internal/gen/issuer/apiv1_issuer"
509
+
pb "example.org/yourmodule/gen/issuer/apiv1_issuer" // generated from proto/v1-issuer.proto
When SPOCP rules are configured, each request is evaluated as a **six-part s-expression** (all six parts are mandatory and must appear in this exact order):
@@ -714,7 +712,7 @@ a string.
714
712
3. **mTLS for gRPC**: Use mutual TLS for the internal Issuer gRPC service (configurable via `grpc_server.tls`)
715
713
4. **Input Validation**: The issuer validates all document data against VCTM schemas
716
714
5. **Audit Logging**: All API operations are logged for compliance (configurable webhook destinations)
717
-
6. **Rate Limiting**: Implement rate limiting at the reverse proxy level to prevent abuse
715
+
6. **Rate Limiting**: apigw has built-in per-IP rate limiting (`apigw.rate_limit`, including `datastore_requests_per_minute`); add reverse-proxy limits on top if needed
Copy file name to clipboardExpand all lines: docs/sirosid/issuers/concepts.md
+43-53Lines changed: 43 additions & 53 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,7 +15,7 @@ Compatible wallets include:
15
15
-**SIROS ID Credential Manager** (based on [wwWallet](/opensource#wwwallet-project)) – used in examples throughout this documentation
16
16
-**EUDI Reference Wallet** – the EU Digital Identity reference implementation
17
17
-**Native mobile wallets** – iOS and Android applications with OID4VCI support
18
-
-**Third-party wallets** – any wallet implementing OID4VCI and supported formats (SD-JWT VC, mDL, JWT VC)
18
+
-**Third-party wallets** – any wallet implementing OID4VCI and supported formats (SD-JWT VC, mDL/mdoc, W3C VC 2.0)
19
19
20
20
:::tip Multi-Wallet Support
21
21
A single issuer deployment can issue credentials to multiple different wallet implementations. The OID4VCI protocol ensures consistent behavior across all compliant wallets.
@@ -116,7 +116,8 @@ The SIROS ID Issuer supports multiple credential formats to meet different use c
|**SD-JWT VC**|[IETF SD-JWT VC](https://datatracker.ietf.org/doc/draft-ietf-oauth-sd-jwt-vc/)| EU Digital Identity, general use | ✅ Yes |
118
118
|**mDL/mDoc**|[ISO 18013-5](https://www.iso.org/standard/69084.html)| Mobile driving licenses | ✅ Yes |
119
-
|**JWT VC**|[W3C VC Data Model](https://www.w3.org/TR/vc-data-model/)| Legacy systems | ❌ No |
119
+
|**W3C VC 2.0** (`ldp_vc`) |[W3C VC Data Model 2.0](https://www.w3.org/TR/vc-data-model-2.0/) with Data Integrity proofs | Linked-data ecosystems | Depends on cryptosuite |
**SD-JWT VC** is the recommended format for new deployments. It provides selective disclosure (users can share only necessary claims) and is the format specified by the EU Digital Identity Wallet Architecture Reference Framework (ARF).
@@ -134,7 +135,7 @@ A **credential type** defines the schema and semantics of a credential. Each typ
@@ -155,9 +156,9 @@ Each credential type is defined by a **VCTM file** that specifies:
155
156
156
157
```json
157
158
{
158
-
"vct": "urn:eudi:pid:arf-1.8:1",
159
+
"vct": "urn:eudi:pid:1",
159
160
"name": "Person Identification Data",
160
-
"description": "EU Person Identification Data credential (ARF 1.8)",
161
+
"description": "EU Person Identification Data credential",
161
162
"display": [
162
163
{
163
164
"lang": "en-US",
@@ -178,24 +179,23 @@ Each credential type is defined by a **VCTM file** that specifies:
178
179
}
179
180
```
180
181
181
-
#### Built-in Credential Types
182
+
#### Shipped Credential Types
182
183
183
-
SIROS ID includes pre-configured types based on EU standards:
184
+
The [vc repository `metadata/` directory](https://github.com/SUNET/vc/tree/main/metadata) ships type metadata for common types, which you reference from `common.credential_metadata`:
184
185
185
-
| Type | VCT | Description |
186
-
|------|-----|-------------|
187
-
|**PID (ARF 1.5)**|`urn:eudi:pid:arf-1.5:1`| Person Identification Data (ARF 1.5) |
188
-
|**PID (ARF 1.8)**|`urn:eudi:pid:arf-1.8:1`| Person Identification Data (ARF 1.8+) |
189
-
|**EHIC**|`urn:eudi:ehic:1`| European Health Insurance Card |
SIROS ID supports both ARF 1.5 and ARF 1.8 PID schemas. Which one a scope uses is determined by the VCTM it points at in `common.credential_metadata`. The generic VCT `urn:eudi:pid:1` is accepted for compatibility but maps to a configured ARF version.
198
-
:::
198
+
Which schema a scope uses is determined by the VCTM (or MDDL) file it points at in `common.credential_metadata`.
199
199
200
200
### Building the Claim Set
201
201
@@ -208,7 +208,8 @@ configuration:
208
208
from and which auth provider identifies the user.
209
209
3.`apigw.auth_providers.<provider>.attribute_mapping` normalises the
210
210
provider's own attribute names to canonical claim names, with optional
211
-
transforms and defaults.
211
+
defaults. Mapping is a rename-and-presence step only; value
212
+
transformations are `derivations` on the scope (see below).
212
213
213
214
APIGW then validates the resulting claim set against the VCTM schema before
214
215
sending it to the issuer for signing.
@@ -217,7 +218,7 @@ sending it to the issuer for signing.
217
218
common:
218
219
credential_metadata:
219
220
pid:
220
-
vctm_file_path: "/metadata/vctm_pid_arf_1_8.json"
221
+
vctm_file_path: "/metadata/vctm_pid.json"
221
222
format: "dc+sd-jwt"
222
223
223
224
apigw:
@@ -234,20 +235,28 @@ apigw:
234
235
required: true
235
236
"urn:oid:0.9.2342.19200300.100.1.3":
236
237
claim: "email_address"
237
-
transform: "lowercase"
238
238
239
239
data_sources:
240
240
# The SAML assertion's claims ARE the credential data
241
241
assertion:
242
242
scopes:
243
243
pid:
244
244
auth_provider: saml
245
+
# Value transformations are derivations on the scope
246
+
derivations:
247
+
- lowercase:
248
+
input: email_address
245
249
```
246
250
247
-
Supported `transform` values are `lowercase`, `uppercase`, `trim`,
248
-
`country_alpha2`, `country_alpha3` and `yyyymmdd_to_iso`. `default:` supplies a
249
-
value when the attribute is absent, and `as_array: true` wraps a scalar in a
250
-
single-element array.
251
+
`default:` supplies a value when the attribute is absent, and `as_array: true`
252
+
wraps a scalar in a single-element array. Available derivation primitives are
| **Status Lists** | Revocation status tracking | Token Status List |
316
325
| **Audit Log** | Compliance and monitoring | Internal |
317
326
318
327
### Service Architecture
319
328
320
-
The issuer can run as a single process or as separate microservices:
321
-
322
-
<div className="row">
323
-
<div className="col col--6">
324
-
325
-
**Single Process Mode**
326
-
327
-
```mermaid
328
-
flowchart TB
329
-
Combined[apigw + issuer + registry]
330
-
```
331
-
332
-
All components in one binary—simplest deployment for development and small-scale production.
333
-
334
-
</div>
335
-
<div className="col col--6">
336
-
337
-
**Microservices Mode**
329
+
The issuer runs as three separate services (`apigw`, `issuer` and `registry`, each its own binary and container image) that talk gRPC to each other and share a MongoDB:
338
330
339
331
```mermaid
340
332
flowchart TB
@@ -343,13 +335,11 @@ flowchart TB
343
335
Registry[Registry Service]
344
336
345
337
APIGW -->|gRPC| Issuer
338
+
APIGW -->|gRPC| Registry
346
339
Issuer -->|gRPC| Registry
347
340
```
348
341
349
-
Separate services for independent scaling and high availability.
350
-
351
-
</div>
352
-
</div>
342
+
All three can run on one host (for example with Docker Compose, see [Deployment](./deployment)) or be scaled independently for high availability.
353
343
354
344
## Deployment Models
355
345
@@ -465,12 +455,12 @@ flowchart LR
465
455
466
456
### Model 4: Standalone Issuer
467
457
468
-
Minimal deployment for testing or air-gapped environments.
458
+
Minimal single-host deployment for testing or air-gapped environments: the same three services and MongoDB, run together on one machine.
0 commit comments