Step by step to verify a VC

Awesome! Lea managed to have her first credential issued. Let's now continue detailing her use case.

5. Lea visits a bank to open an account.

No big deal. She access http://bank.com and clicked at the "Open Account" button.

6. Lea is asked for her information, so shares her government-issued credentials.

Let's break it down:

  • Lea is asked for her information

    Using the most appropriate technical vocabulary, it's the same as saying that "the bank generates a credential presentation request and send it to Lea".

    The presentation request can be generated using the /openid4vc/verify endpoint.

    This is the simplest way to call it:

    curl -X 'POST' \
      'https://verifier.portal.walt.id/openid4vc/verify' \
      -H 'accept: */*' \
      -H 'authorizeBaseUrl: openid4vp://authorize' \
      -H 'responseMode: direct_post' \
      -H 'Content-Type: application/json' \
      -d '{
      "request_credentials": [
        "OpenBadgeCredential"
      ]
    }'
    

    The presentation request comes in the form of a URL:

    openid4vp://authorize?response_type=vp_token&client_id=&response_mode=direct_post&state=rdnEUZBr1oP&presentation_definition_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fpd%2FrdnEUZBr1oP&client_id_scheme=redirect_uri&response_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fverify%2FrdnEUZBr1oP
    

    Notice that there is a query parameter state=rdnEUZBr1oP somwhere in the middle of this URL. The request we made has just started a session presentation and this value is the session id. Save it for later use.

    This URL now needs to be sent from the Verifier to the Wallet App. The easiest way is by the Verifier generating a QrCode to be scanned by the Wallet. Pretty much the same thing we did at the credential offer request.

    What happens, then:

    • Lea uses her Wallet App to scan the QrCode and gets the presentation request URL.
    • The App will ask her if she wants to present the requested credentials.
    • If she says "yes", the Wallet App will search in her wallet all the credentials that matches the presentation request criteria. In our example, credentials of type OpenBadgeCredential.
  • she shares her government-issued credentials

    With the presentation request URL and the id of the credential she wants to present, Lea can now share her government-issued document with the bank to get her account opened.

    The presentation is done with the /wallet-api/wallet/{wallet}/exchange/usePresentationRequest endpoint.

    However, before calling it, we need first to make some adjustments in the presentation request URL. We do it with the /wallet-api/wallet/{wallet}/exchange/resolvePresentationRequest endpoint providing the wallet id in the URL and the presentation request URL in the body of the request.

    curl -X 'POST' \
      'https://wallet.walt.id/wallet-api/wallet/6e802709-7d60-4dd2-a599-6c775c8a66eb/exchange/resolvePresentationRequest' \
      -H 'accept: text/plain' \
      -H 'Content-Type: text/plain' \
      -d 'openid4vp://authorize?response_type=vp_token&client_id=&response_mode=direct_post&state=rdnEUZBr1oP&presentation_definition_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fpd%2FrdnEUZBr1oP&client_id_scheme=redirect_uri&response_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fverify%2FrdnEUZBr1oP'
    

    The response is a "resolved" version of the presentation URL, whatever "resolved" actually means. Let's not worry about that now.

    openid4vp://authorize?response_type=vp_token&client_id=&response_mode=direct_post&state=rdnEUZBr1oP&presentation_definition=%7B%22input_descriptors%22%3A%5B%7B%22id%22%3A%22OpenBadgeCredential%22%2C%22format%22%3A%7B%22jwt_vc_json%22%3A%7B%22alg%22%3A%5B%22EdDSA%22%5D%7D%7D%2C%22constraints%22%3A%7B%22fields%22%3A%5B%7B%22path%22%3A%5B%22%24.type%22%5D%2C%22filter%22%3A%7B%22type%22%3A%22string%22%2C%22pattern%22%3A%22OpenBadgeCredential%22%7D%7D%5D%7D%7D%5D%7D&presentation_definition_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fpd%2FrdnEUZBr1oP&client_id_scheme=redirect_uri&response_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fverify%2FrdnEUZBr1oP
    

    Now we are ready to share the chosen credential with the Bank. It's now time to call the /wallet-api/wallet/{wallet}/exchange/usePresentationRequest endpoint.

    curl -X 'POST' \
      'https://wallet.walt.id/wallet-api/wallet/6e802709-7d60-4dd2-a599-6c775c8a66eb/exchange/usePresentationRequest' \
      -H 'accept: application/json' \
      -H 'Content-Type: application/json' \
      -d '{
      "did": "did:key:z6MkoFpAKhfFrZRrBERK8nMNGuRSdhDUrymbF41AsKM8m8TJ",
      "presentationRequest": "openid4vp://authorize?response_type=vp_token&client_id=&response_mode=direct_post&state=rdnEUZBr1oP&presentation_definition=%7B%22input_descriptors%22%3A%5B%7B%22id%22%3A%22OpenBadgeCredential%22%2C%22format%22%3A%7B%22jwt_vc_json%22%3A%7B%22alg%22%3A%5B%22EdDSA%22%5D%7D%7D%2C%22constraints%22%3A%7B%22fields%22%3A%5B%7B%22path%22%3A%5B%22%24.type%22%5D%2C%22filter%22%3A%7B%22type%22%3A%22string%22%2C%22pattern%22%3A%22OpenBadgeCredential%22%7D%7D%5D%7D%7D%5D%7D&presentation_definition_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fpd%2FrdnEUZBr1oP&client_id_scheme=redirect_uri&response_uri=https%3A%2F%2Fverifier.portal.walt.id%2Fopenid4vc%2Fverify%2FrdnEUZBr1oP",
      "selectedCredentials": [
        "urn:uuid:b9843e3a-97ab-4c6f-ae43-01e2c495ff69"
      ]
    }'
    

    If the response has a status 200, it means the presentation was accepted and that the verification was successful.

7. The bank verifies the credentials and opens an account for Lea.

When the /wallet-api/wallet/{wallet}/exchange/usePresentationRequest endpoint is called, a set of verification policies are applied to the submitted credential. If all of them are succeeded, the response code will be 200. If any of them fails, the response code will be 400.

In order to get details about the applied policies and their results, we call the /openid4vc/session/{id} endpoint.

Note that the endpoing expects an id as a parameter. This is the id of the session presentation we got before.

curl -X 'GET' \
  'https://verifier.portal.walt.id/openid4vc/session/rdnEUZBr1oP' \
  -H 'accept: */*'

The response has all the informations about the applied policies and their results.

{
    "id": "rdnEUZBr1oP",
    "presentationDefinition": {
        "input_descriptors": [
            {
                "id": "OpenBadgeCredential",
                "format": {
                    "jwt_vc_json": {
                        "alg": [
                            "EdDSA"
                        ]
                    }
                },
                "constraints": {
                    "fields": [
                        {
                            "path": [
                                "$.type"
                            ],
                            "filter": {
                                "type": "string",
                                "pattern": "OpenBadgeCredential"
                            }
                        }
                    ]
                }
            }
        ]
    },
    "tokenResponse": {
        "vp_token": "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejZNa29GcEFLaGZGclpSckJFUks4bk1OR3VSU2RoRFVyeW1iRjQxQXNLTThtOFRKI3o2TWtvRnBBS2hmRnJaUnJCRVJLOG5NTkd1UlNkaERVcnltYkY0MUFzS004bThUSiJ9.eyJzdWIiOiJkaWQ6a2V5Ono2TWtvRnBBS2hmRnJaUnJCRVJLOG5NTkd1UlNkaERVcnltYkY0MUFzS004bThUSiIsIm5iZiI6MTcxNzQxMjE5NSwiaWF0IjoxNzE3NDEyMjU1LCJqdGkiOiIxIiwiaXNzIjoiZGlkOmtleTp6Nk1rb0ZwQUtoZkZyWlJyQkVSSzhuTU5HdVJTZGhEVXJ5bWJGNDFBc0tNOG04VEoiLCJub25jZSI6IiIsImF1ZCI6IiIsInZwIjp7IkBjb250ZXh0IjpbImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZVByZXNlbnRhdGlvbiJdLCJpZCI6IjEiLCJob2xkZXIiOiJkaWQ6a2V5Ono2TWtvRnBBS2hmRnJaUnJCRVJLOG5NTkd1UlNkaERVcnltYkY0MUFzS004bThUSiIsInZlcmlmaWFibGVDcmVkZW50aWFsIjpbImV5SmhiR2NpT2lKRlpFUlRRU0lzSW5SNWNDSTZJa3BYVkNJc0ltdHBaQ0k2SW1ScFpEcHJaWGs2ZWpaTmEycHZVbWh4TVdwVFRrcGtUR2x5ZFZOWWNrWkdlR0ZuY1hKNmRGcGhXRWh4U0VkVlZFdEtZbU5PZVhkd0luMC5leUpwYzNNaU9pSmthV1E2YTJWNU9ubzJUV3RxYjFKb2NURnFVMDVLWkV4cGNuVlRXSEpHUm5oaFozRnllblJhWVZoSWNVaEhWVlJMU21KalRubDNjQ0lzSW5OMVlpSTZJbVJwWkRwclpYazZlalpOYTI5R2NFRkxhR1pHY2xwU2NrSkZVa3M0YmsxT1IzVlNVMlJvUkZWeWVXMWlSalF4UVhOTFRUaHRPRlJLSWl3aWRtTWlPbnNpUUdOdmJuUmxlSFFpT2xzaWFIUjBjSE02THk5M2QzY3Vkek11YjNKbkx6SXdNVGd2WTNKbFpHVnVkR2xoYkhNdmRqRWlMQ0pvZEhSd2N6b3ZMM0IxY213dWFXMXpaMnh2WW1Gc0xtOXlaeTl6Y0dWakwyOWlMM1l6Y0RBdlkyOXVkR1Y0ZEM1cWMyOXVJbDBzSW1sa0lqb2lkWEp1T25WMWFXUTZZams0TkRObE0yRXRPVGRoWWkwMFl6Wm1MV0ZsTkRNdE1ERmxNbU0wT1RWbVpqWTVJaXdpZEhsd1pTSTZXeUpXWlhKcFptbGhZbXhsUTNKbFpHVnVkR2xoYkNJc0lrOXdaVzVDWVdSblpVTnlaV1JsYm5ScFlXd2lYU3dpYm1GdFpTSTZJa3BHUmlCNElIWmpMV1ZrZFNCUWJIVm5SbVZ6ZENBeklFbHVkR1Z5YjNCbGNtRmlhV3hwZEhraUxDSnBjM04xWlhJaU9uc2lkSGx3WlNJNld5SlFjbTltYVd4bElsMHNJbWxrSWpvaVpHbGtPbXRsZVRwNk5rMXJhbTlTYUhFeGFsTk9TbVJNYVhKMVUxaHlSa1o0WVdkeGNucDBXbUZZU0hGSVIxVlVTMHBpWTA1NWQzQWlMQ0p1WVcxbElqb2lTbTlpY3lCbWIzSWdkR2hsSUVaMWRIVnlaU0FvU2taR0tTSXNJblZ5YkNJNkltaDBkSEJ6T2k4dmQzZDNMbXBtWmk1dmNtY3ZJaXdpYVcxaFoyVWlPaUpvZEhSd2N6b3ZMM2N6WXkxalkyY3VaMmwwYUhWaUxtbHZMM1pqTFdWa0wzQnNkV2RtWlhOMExURXRNakF5TWk5cGJXRm5aWE12U2taR1gweHZaMjlNYjJOcmRYQXVjRzVuSW4wc0ltbHpjM1ZoYm1ObFJHRjBaU0k2SWpJd01qUXRNRFl0TUROVU1EZzZNVGc2TWpBdU5UZ3lNakUwT1RZNVdpSXNJbVY0Y0dseVlYUnBiMjVFWVhSbElqb2lNakF5TlMwd05pMHdNMVF3T0RveE9Eb3lNQzQxT0RJeU9UZ3dNRGRhSWl3aVkzSmxaR1Z1ZEdsaGJGTjFZbXBsWTNRaU9uc2lhV1FpT2lKa2FXUTZhMlY1T25vMlRXdHZSbkJCUzJobVJuSmFVbkpDUlZKTE9HNU5Ua2QxVWxOa2FFUlZjbmx0WWtZME1VRnpTMDA0YlRoVVNpSXNJblI1Y0dVaU9sc2lRV05vYVdWMlpXMWxiblJUZFdKcVpXTjBJbDBzSW1GamFHbGxkbVZ0Wlc1MElqcDdJbWxrSWpvaWRYSnVPblYxYVdRNllXTXlOVFJpWkRVdE9HWmhaQzAwWW1JeExUbGtNamt0Wldaa09UTTROVE0yT1RJMklpd2lkSGx3WlNJNld5SkJZMmhwWlhabGJXVnVkQ0pkTENKdVlXMWxJam9pU2taR0lIZ2dkbU10WldSMUlGQnNkV2RHWlhOMElETWdTVzUwWlhKdmNHVnlZV0pwYkdsMGVTSXNJbVJsYzJOeWFYQjBhVzl1SWpvaVZHaHBjeUIzWVd4c1pYUWdjM1Z3Y0c5eWRITWdkR2hsSUhWelpTQnZaaUJYTTBNZ1ZtVnlhV1pwWVdKc1pTQkRjbVZrWlc1MGFXRnNjeUJoYm1RZ2FHRnpJR1JsYlc5dWMzUnlZWFJsWkNCcGJuUmxjbTl3WlhKaFltbHNhWFI1SUdSMWNtbHVaeUIwYUdVZ2NISmxjMlZ1ZEdGMGFXOXVJSEpsY1hWbGMzUWdkMjl5YTJac2IzY2daSFZ5YVc1bklFcEdSaUI0SUZaRExVVkVWU0JRYkhWblJtVnpkQ0F6TGlJc0ltTnlhWFJsY21saElqcDdJblI1Y0dVaU9pSkRjbWwwWlhKcFlTSXNJbTVoY25KaGRHbDJaU0k2SWxkaGJHeGxkQ0J6YjJ4MWRHbHZibk1nY0hKdmRtbGtaWEp6SUdWaGNtNWxaQ0IwYUdseklHSmhaR2RsSUdKNUlHUmxiVzl1YzNSeVlYUnBibWNnYVc1MFpYSnZjR1Z5WVdKcGJHbDBlU0JrZFhKcGJtY2dkR2hsSUhCeVpYTmxiblJoZEdsdmJpQnlaWEYxWlhOMElIZHZjbXRtYkc5M0xpQlVhR2x6SUdsdVkyeDFaR1Z6SUhOMVkyTmxjM05tZFd4c2VTQnlaV05sYVhacGJtY2dZU0J3Y21WelpXNTBZWFJwYjI0Z2NtVnhkV1Z6ZEN3Z1lXeHNiM2RwYm1jZ2RHaGxJR2h2YkdSbGNpQjBieUJ6Wld4bFkzUWdZWFFnYkdWaGMzUWdkSGR2SUhSNWNHVnpJRzltSUhabGNtbG1hV0ZpYkdVZ1kzSmxaR1Z1ZEdsaGJITWdkRzhnWTNKbFlYUmxJR0VnZG1WeWFXWnBZV0pzWlNCd2NtVnpaVzUwWVhScGIyNHNJSEpsZEhWeWJtbHVaeUIwYUdVZ2NISmxjMlZ1ZEdGMGFXOXVJSFJ2SUhSb1pTQnlaWEYxWlhOMGIzSXNJR0Z1WkNCd1lYTnphVzVuSUhabGNtbG1hV05oZEdsdmJpQnZaaUIwYUdVZ2NISmxjMlZ1ZEdGMGFXOXVJR0Z1WkNCMGFHVWdhVzVqYkhWa1pXUWdZM0psWkdWdWRHbGhiSE11SW4wc0ltbHRZV2RsSWpwN0ltbGtJam9pYUhSMGNITTZMeTkzTTJNdFkyTm5MbWRwZEdoMVlpNXBieTkyWXkxbFpDOXdiSFZuWm1WemRDMHpMVEl3TWpNdmFXMWhaMlZ6TDBwR1JpMVdReTFGUkZVdFVFeFZSMFpGVTFRekxXSmhaR2RsTFdsdFlXZGxMbkJ1WnlJc0luUjVjR1VpT2lKSmJXRm5aU0o5ZlgxOUxDSnFkR2tpT2lKMWNtNDZkWFZwWkRwaU9UZzBNMlV6WVMwNU4yRmlMVFJqTm1ZdFlXVTBNeTB3TVdVeVl6UTVOV1ptTmpraUxDSmxlSEFpT2pFM05EZzVNemczTURBc0ltbGhkQ0k2TVRjeE56UXdNamN3TUN3aWJtSm1Jam94TnpFM05EQXlOekF3ZlEuTTByUnFQV0tGMXpFRWtGZEdVUE0yeXZOYnl1WnEyZ2ZLRHRhSzVZWmdqTkJsR0ZwcUxLZFRzajdqZ2M3LTZvaXlHZVZkZ29CZlUxVjEtTllZbGNkQ2ciXX19.UyIOtzdTUzhXUai1eBGtULUvHpybwlIqn8D-yQBP0VaMxrUSM23NNgsOS-oHLP0CER-c9aA8iEsQrapx1FltAw",
        "presentation_submission": {
            "id": "1",
            "definition_id": "1",
            "descriptor_map": [
                {
                    "id": "OpenBadgeCredential",
                    "format": "jwt_vp",
                    "path": "$",
                    "path_nested": {
                        "id": "OpenBadgeCredential",
                        "format": "jwt_vc_json",
                        "path": "$.verifiableCredential[0]"
                    }
                }
            ]
        },
        "state": "rdnEUZBr1oP"
    },
    "verificationResult": true,
    "policyResults": {
        "results": [
            {
                "credential": "VerifiablePresentation",
                "policies": [
                    {
                        "policy": "signature",
                        "description": "Checks a JWT credential by verifying its cryptographic signature using the key referenced by the DID in `iss`.",
                        "is_success": true,
                        "result": {
                            "sub": "did:key:z6MkoFpAKhfFrZRrBERK8nMNGuRSdhDUrymbF41AsKM8m8TJ",
                            "nbf": 1717412195,
                            "iat": 1717412255,
                            "jti": "1",
                            "iss": "did:key:z6MkoFpAKhfFrZRrBERK8nMNGuRSdhDUrymbF41AsKM8m8TJ",
                            "nonce": "",
                            "aud": "",
                            "vp": {
                                "@context": [
                                    "https://www.w3.org/2018/credentials/v1"
                                ],
                                "type": [
                                    "VerifiablePresentation"
                                ],
                                "id": "1",
                                "holder": "did:key:z6MkoFpAKhfFrZRrBERK8nMNGuRSdhDUrymbF41AsKM8m8TJ",
                                "verifiableCredential": [
                                    "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCIsImtpZCI6ImRpZDprZXk6ejZNa2pvUmhxMWpTTkpkTGlydVNYckZGeGFncXJ6dFphWEhxSEdVVEtKYmNOeXdwIn0.eyJpc3MiOiJkaWQ6a2V5Ono2TWtqb1JocTFqU05KZExpcnVTWHJGRnhhZ3FyenRaYVhIcUhHVVRLSmJjTnl3cCIsInN1YiI6ImRpZDprZXk6ejZNa29GcEFLaGZGclpSckJFUks4bk1OR3VSU2RoRFVyeW1iRjQxQXNLTThtOFRKIiwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3B1cmwuaW1zZ2xvYmFsLm9yZy9zcGVjL29iL3YzcDAvY29udGV4dC5qc29uIl0sImlkIjoidXJuOnV1aWQ6Yjk4NDNlM2EtOTdhYi00YzZmLWFlNDMtMDFlMmM0OTVmZjY5IiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIk9wZW5CYWRnZUNyZWRlbnRpYWwiXSwibmFtZSI6IkpGRiB4IHZjLWVkdSBQbHVnRmVzdCAzIEludGVyb3BlcmFiaWxpdHkiLCJpc3N1ZXIiOnsidHlwZSI6WyJQcm9maWxlIl0sImlkIjoiZGlkOmtleTp6Nk1ram9SaHExalNOSmRMaXJ1U1hyRkZ4YWdxcnp0WmFYSHFIR1VUS0piY055d3AiLCJuYW1lIjoiSm9icyBmb3IgdGhlIEZ1dHVyZSAoSkZGKSIsInVybCI6Imh0dHBzOi8vd3d3LmpmZi5vcmcvIiwiaW1hZ2UiOiJodHRwczovL3czYy1jY2cuZ2l0aHViLmlvL3ZjLWVkL3BsdWdmZXN0LTEtMjAyMi9pbWFnZXMvSkZGX0xvZ29Mb2NrdXAucG5nIn0sImlzc3VhbmNlRGF0ZSI6IjIwMjQtMDYtMDNUMDg6MTg6MjAuNTgyMjE0OTY5WiIsImV4cGlyYXRpb25EYXRlIjoiMjAyNS0wNi0wM1QwODoxODoyMC41ODIyOTgwMDdaIiwiY3JlZGVudGlhbFN1YmplY3QiOnsiaWQiOiJkaWQ6a2V5Ono2TWtvRnBBS2hmRnJaUnJCRVJLOG5NTkd1UlNkaERVcnltYkY0MUFzS004bThUSiIsInR5cGUiOlsiQWNoaWV2ZW1lbnRTdWJqZWN0Il0sImFjaGlldmVtZW50Ijp7ImlkIjoidXJuOnV1aWQ6YWMyNTRiZDUtOGZhZC00YmIxLTlkMjktZWZkOTM4NTM2OTI2IiwidHlwZSI6WyJBY2hpZXZlbWVudCJdLCJuYW1lIjoiSkZGIHggdmMtZWR1IFBsdWdGZXN0IDMgSW50ZXJvcGVyYWJpbGl0eSIsImRlc2NyaXB0aW9uIjoiVGhpcyB3YWxsZXQgc3VwcG9ydHMgdGhlIHVzZSBvZiBXM0MgVmVyaWZpYWJsZSBDcmVkZW50aWFscyBhbmQgaGFzIGRlbW9uc3RyYXRlZCBpbnRlcm9wZXJhYmlsaXR5IGR1cmluZyB0aGUgcHJlc2VudGF0aW9uIHJlcXVlc3Qgd29ya2Zsb3cgZHVyaW5nIEpGRiB4IFZDLUVEVSBQbHVnRmVzdCAzLiIsImNyaXRlcmlhIjp7InR5cGUiOiJDcml0ZXJpYSIsIm5hcnJhdGl2ZSI6IldhbGxldCBzb2x1dGlvbnMgcHJvdmlkZXJzIGVhcm5lZCB0aGlzIGJhZGdlIGJ5IGRlbW9uc3RyYXRpbmcgaW50ZXJvcGVyYWJpbGl0eSBkdXJpbmcgdGhlIHByZXNlbnRhdGlvbiByZXF1ZXN0IHdvcmtmbG93LiBUaGlzIGluY2x1ZGVzIHN1Y2Nlc3NmdWxseSByZWNlaXZpbmcgYSBwcmVzZW50YXRpb24gcmVxdWVzdCwgYWxsb3dpbmcgdGhlIGhvbGRlciB0byBzZWxlY3QgYXQgbGVhc3QgdHdvIHR5cGVzIG9mIHZlcmlmaWFibGUgY3JlZGVudGlhbHMgdG8gY3JlYXRlIGEgdmVyaWZpYWJsZSBwcmVzZW50YXRpb24sIHJldHVybmluZyB0aGUgcHJlc2VudGF0aW9uIHRvIHRoZSByZXF1ZXN0b3IsIGFuZCBwYXNzaW5nIHZlcmlmaWNhdGlvbiBvZiB0aGUgcHJlc2VudGF0aW9uIGFuZCB0aGUgaW5jbHVkZWQgY3JlZGVudGlhbHMuIn0sImltYWdlIjp7ImlkIjoiaHR0cHM6Ly93M2MtY2NnLmdpdGh1Yi5pby92Yy1lZC9wbHVnZmVzdC0zLTIwMjMvaW1hZ2VzL0pGRi1WQy1FRFUtUExVR0ZFU1QzLWJhZGdlLWltYWdlLnBuZyIsInR5cGUiOiJJbWFnZSJ9fX19LCJqdGkiOiJ1cm46dXVpZDpiOTg0M2UzYS05N2FiLTRjNmYtYWU0My0wMWUyYzQ5NWZmNjkiLCJleHAiOjE3NDg5Mzg3MDAsImlhdCI6MTcxNzQwMjcwMCwibmJmIjoxNzE3NDAyNzAwfQ.M0rRqPWKF1zEEkFdGUPM2yvNbyuZq2gfKDtaK5YZgjNBlGFpqLKdTsj7jgc7-6oiyGeVdgoBfU1V1-NYYlcdCg"
                                ]
                            }
                        }
                    }
                ]
            },
            {
                "credential": "OpenBadgeCredential",
                "policies": [
                    {
                        "policy": "signature",
                        "description": "Checks a JWT credential by verifying its cryptographic signature using the key referenced by the DID in `iss`.",
                        "is_success": true,
                        "result": {
                            "iss": "did:key:z6MkjoRhq1jSNJdLiruSXrFFxagqrztZaXHqHGUTKJbcNywp",
                            "sub": "did:key:z6MkoFpAKhfFrZRrBERK8nMNGuRSdhDUrymbF41AsKM8m8TJ",
                            "vc": {
                                "@context": [
                                    "https://www.w3.org/2018/credentials/v1",
                                    "https://purl.imsglobal.org/spec/ob/v3p0/context.json"
                                ],
                                "id": "urn:uuid:b9843e3a-97ab-4c6f-ae43-01e2c495ff69",
                                "type": [
                                    "VerifiableCredential",
                                    "OpenBadgeCredential"
                                ],
                                "name": "JFF x vc-edu PlugFest 3 Interoperability",
                                "issuer": {
                                    "type": [
                                        "Profile"
                                    ],
                                    "id": "did:key:z6MkjoRhq1jSNJdLiruSXrFFxagqrztZaXHqHGUTKJbcNywp",
                                    "name": "Jobs for the Future (JFF)",
                                    "url": "https://www.jff.org/",
                                    "image": "https://w3c-ccg.github.io/vc-ed/plugfest-1-2022/images/JFF_LogoLockup.png"
                                },
                                "issuanceDate": "2024-06-03T08:18:20.582214969Z",
                                "expirationDate": "2025-06-03T08:18:20.582298007Z",
                                "credentialSubject": {
                                    "id": "did:key:z6MkoFpAKhfFrZRrBERK8nMNGuRSdhDUrymbF41AsKM8m8TJ",
                                    "type": [
                                        "AchievementSubject"
                                    ],
                                    "achievement": {
                                        "id": "urn:uuid:ac254bd5-8fad-4bb1-9d29-efd938536926",
                                        "type": [
                                            "Achievement"
                                        ],
                                        "name": "JFF x vc-edu PlugFest 3 Interoperability",
                                        "description": "This wallet supports the use of W3C Verifiable Credentials and has demonstrated interoperability during the presentation request workflow during JFF x VC-EDU PlugFest 3.",
                                        "criteria": {
                                            "type": "Criteria",
                                            "narrative": "Wallet solutions providers earned this badge by demonstrating interoperability during the presentation request workflow. This includes successfully receiving a presentation request, allowing the holder to select at least two types of verifiable credentials to create a verifiable presentation, returning the presentation to the requestor, and passing verification of the presentation and the included credentials."
                                        },
                                        "image": {
                                            "id": "https://w3c-ccg.github.io/vc-ed/plugfest-3-2023/images/JFF-VC-EDU-PLUGFEST3-badge-image.png",
                                            "type": "Image"
                                        }
                                    }
                                }
                            },
                            "jti": "urn:uuid:b9843e3a-97ab-4c6f-ae43-01e2c495ff69",
                            "exp": 1748938700,
                            "iat": 1717402700,
                            "nbf": 1717402700
                        }
                    }
                ]
            }
        ],
        "success": true,
        "time": "0.0059s",
        "policies_run": 2,
        "policies_failed": 0,
        "policies_succeeded": 2
    }
}

Congratulations, Lea. Since all policies have succeeded, the Bank has accepted your open account request.

Final remarks

What we've shown here is just the tip of the iceberg. The possibilities are endless once you understand this basic flow of issuing and verifying a credential.

Our Discord server has a specific channel for publicizing projects that are using Walt.id. We invite you to join our community and take this exciting journey of decentralized identities together.