From 1c9fa23aabbadc248b3d8547db1613c9dcd5dc4d Mon Sep 17 00:00:00 2001 From: Rein Krul Date: Wed, 23 Oct 2024 08:09:29 +0200 Subject: [PATCH] Issuing and rendering JWT-VC credentials --- api/api.go | 4 ++-- identity/model.go | 8 ++++---- identity/service.go | 7 +++++-- issuer/service.go | 5 +++-- model/model.go | 19 ++++++++++++++++++ .../admin/credentials/CredentialDetails.vue | 20 +++++++++++++++++-- web/src/admin/credentials/IssueCredential.vue | 11 ++++++++++ web/src/index.js | 2 +- web/src/style.css | 1 + 9 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 model/model.go diff --git a/api/api.go b/api/api.go index e86d720..c0f4737 100644 --- a/api/api.go +++ b/api/api.go @@ -1,10 +1,10 @@ package api import ( - "github.com/nuts-foundation/go-did/vc" "github.com/nuts-foundation/nuts-admin/discovery" "github.com/nuts-foundation/nuts-admin/identity" "github.com/nuts-foundation/nuts-admin/issuer" + "github.com/nuts-foundation/nuts-admin/model" "net/http" "strings" @@ -52,7 +52,7 @@ func (w Wrapper) GetIssuedCredentials(ctx echo.Context, params GetIssuedCredenti if err != nil { return err } - result := make([]vc.VerifiableCredential, 0) + result := make([]model.VerifiableCredential, 0) for _, currID := range identities { for _, issuerDID := range currID.DIDs { credentials, err := w.IssuerService.GetIssuedCredentials(ctx.Request().Context(), issuerDID, strings.Split(params.CredentialTypes, ",")) diff --git a/identity/model.go b/identity/model.go index aa8ca75..b4889f9 100644 --- a/identity/model.go +++ b/identity/model.go @@ -2,8 +2,8 @@ package identity import ( "github.com/nuts-foundation/go-did/did" - "github.com/nuts-foundation/go-did/vc" "github.com/nuts-foundation/nuts-admin/discovery" + "github.com/nuts-foundation/nuts-admin/model" ) type Identity struct { @@ -13,7 +13,7 @@ type Identity struct { type IdentityDetails struct { Identity - DIDDocuments []did.Document `json:"did_documents"` - DiscoveryServices []discovery.DIDStatus `json:"discovery_services"` - WalletCredentials []vc.VerifiableCredential `json:"wallet_credentials"` + DIDDocuments []did.Document `json:"did_documents"` + DiscoveryServices []discovery.DIDStatus `json:"discovery_services"` + WalletCredentials []model.VerifiableCredential `json:"wallet_credentials"` } diff --git a/identity/service.go b/identity/service.go index 3fa9b7a..3dc0ac6 100644 --- a/identity/service.go +++ b/identity/service.go @@ -8,6 +8,7 @@ import ( "github.com/nuts-foundation/go-nuts-client/nuts/vcr" "github.com/nuts-foundation/go-nuts-client/nuts/vdr" "github.com/nuts-foundation/nuts-admin/discovery" + "github.com/nuts-foundation/nuts-admin/model" "slices" "strings" ) @@ -62,7 +63,7 @@ func (i Service) Get(ctx context.Context, subjectID string) (*IdentityDetails, e result := IdentityDetails{ Identity: *identity, DiscoveryServices: make([]discovery.DIDStatus, 0), - WalletCredentials: make([]vc.VerifiableCredential, 0), + WalletCredentials: make([]model.VerifiableCredential, 0), } // Get DIDDocuments @@ -96,10 +97,12 @@ func (i Service) Get(ctx context.Context, subjectID string) (*IdentityDetails, e }) // Get WalletCredentials - result.WalletCredentials, err = i.credentialsInWallet(ctx, subjectID) + vcs, err := i.credentialsInWallet(ctx, subjectID) if err != nil { return nil, err } + creds := model.ToModel(vcs) + result.WalletCredentials = creds return &result, nil } diff --git a/issuer/service.go b/issuer/service.go index fd568cb..0a44e1c 100644 --- a/issuer/service.go +++ b/issuer/service.go @@ -6,6 +6,7 @@ import ( "github.com/nuts-foundation/go-nuts-client/nuts" "github.com/nuts-foundation/go-nuts-client/nuts/vcr" "github.com/nuts-foundation/nuts-admin/identity" + "github.com/nuts-foundation/nuts-admin/model" "strings" ) @@ -14,7 +15,7 @@ type Service struct { VCRClient *vcr.Client } -func (s Service) GetIssuedCredentials(ctx context.Context, issuer string, credentialTypes []string) ([]vc.VerifiableCredential, error) { +func (s Service) GetIssuedCredentials(ctx context.Context, issuer string, credentialTypes []string) ([]model.VerifiableCredential, error) { var result []vc.VerifiableCredential for _, credentialType := range credentialTypes { credentialType = strings.TrimSpace(credentialType) @@ -33,5 +34,5 @@ func (s Service) GetIssuedCredentials(ctx context.Context, issuer string, creden result = append(result, searchResult.VerifiableCredential) } } - return result, nil + return model.ToModel(result), nil } diff --git a/model/model.go b/model/model.go new file mode 100644 index 0000000..33fb7e5 --- /dev/null +++ b/model/model.go @@ -0,0 +1,19 @@ +package model + +import "github.com/nuts-foundation/go-did/vc" + +type VerifiableCredential vc.VerifiableCredential + +func ToModel(vcs []vc.VerifiableCredential) []VerifiableCredential { + var result []VerifiableCredential + for _, credential := range vcs { + currentCredential := VerifiableCredential(credential) + if credential.Format() == vc.JWTCredentialProofFormat { + currentCredential.Proof = []interface{}{ + "jwt", + } + } + result = append(result, currentCredential) + } + return result +} diff --git a/web/src/admin/credentials/CredentialDetails.vue b/web/src/admin/credentials/CredentialDetails.vue index befc29b..b25530d 100644 --- a/web/src/admin/credentials/CredentialDetails.vue +++ b/web/src/admin/credentials/CredentialDetails.vue @@ -4,7 +4,7 @@
-
{{credential.credentialSubject.id}}
+
{{credentialSubject.id}}
@@ -14,6 +14,14 @@
{{credential.issuer}}
+
+ +
{{credential.issuanceDate}}
+
+
+ +
{{credential.expirationDate}}
+
Credential Subject
@@ -33,7 +41,6 @@
-