Skip to content

Latest commit

 

History

History
283 lines (218 loc) · 19.7 KB

verifiable-credentials-developer-sdk.md

File metadata and controls

283 lines (218 loc) · 19.7 KB

Verifiable Credentials Developer SDK

The @verida/verifiable-credential package contains all the necessary capabilities to issue, verify and share Verifiable Credentials on the Verida Network.

Issuing a Credential

A credential is issued by creating a JSON object (credentialData) containing data matching the schema of the credential to be created. This credentialData object is then passed to credentialSDK.createCredentialJWT() which populates a didJwtVc attribute containing a signed, verified DID JWT Verifiable Credential.

The code below creates a credential that matches a predefined credential schema (https://common.schemas.verida.io/health/pathology/tests/covid19/pcr/v0.1.0/schema.json).

import Credentials from "@verida/verifiable-credentials";

// Note: `context` should already be obtained by connecting to the Verida Network
const credentialSDK = new Credentials();

// The Verida DID that is the subject of this credential (who is being verified with this credential?)
const subjectDid = 'did:vda:polyamoy:0x....';

const credentialSchema = 'https://common.schemas.verida.io/identity/kyc/FinClusive/individual-basic/latest/schema.json'

// Data for the credential that matches the credential schema
const credentialData = {
  "finClusiveId": "12345",
  "gender": "male",
  "firstName": "Chris",
  "lastName": "Tester",
  "streetAddress1": "123 Four Ave",
  "suburb": "Adelaide",
  "state": "SA",
  "postcode": "5000",
  "dateOfBirth": "2000-01-01"
}

const title = 'KYC Credential'
const summary = 'Credential issued by <signer> on <date>'
const options = {}

const credentialRecord = await credentials.createVerifiableCredentialRecord({
  context: context as any,
  data: credentialData,
  subjectId: subjectDid,
  schema: credentialSchema,
  options
}, title, summary);

This generates a credentialRecord matching the Verida Credential data storage schema (https://common.schemas.verida.io/credential/base/v0.2.0/schema.json):

{
  name: 'KYC Credential',
  summary: 'Credential issued by <signer> on <date>',
  schema: 'https://common.schemas.verida.io/credential/base/v0.2.0/schema.json',
  credentialData: {
    "finClusiveId": "12345",
    "gender": "male",
    "firstName": "Chris",
    "lastName": "Tester",
    "streetAddress1": "123 Four Ave",
    "suburb": "Adelaide",
    "state": "SA",
    "postcode": "5000",
    "dateOfBirth": "2000-01-01"
  },
  credentialSchema: 'https://common.schemas.verida.io/identity/kyc/FinClusive/individual-basic/latest/schema.json',
  didJwtVc: 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sInN1YiI6ImRpZDp2ZGE6MHhDMjYyOTk4MkEyNTg1NTQ0RkQ3MmM5OUNGMzc3M2E5YzZiYUJENTVjIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOiJkaWQ6dmRhOjB4QjM3Mjk5ODJBMjU4NTU0NEZENzJjOTlDRjM3NzNhOWM2YmFCRDU1YyIsImlzc3VhbmNlRGF0ZSI6IjIwMjItMDMtMDhUMjM6MTQ6MjUuNzUxWiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImZ1bGxOYW1lIjoiSmFuZSBEb2UiLCJkYXRlT2ZCaXJ0aCI6IjE5OTItMDctMDMiLCJwYXRpZW50SWQiOiJBQkMxMjMiLCJ0ZXN0VGltZXN0YW1wIjoiMjAyMi0wMy0wMVQxMDozMDowNS40MzVaIiwicmVzdWx0IjoiTmVnYXRpdmUiLCJzY2hlbWEiOiJodHRwczovL2NvbW1vbi5zY2hlbWFzLnZlcmlkYS5pby9oZWFsdGgvcGF0aG9sb2d5L3Rlc3RzL2NvdmlkMTkvcGNyL3YwLjEuMC9zY2hlbWEuanNvbiJ9LCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9jb21tb24uc2NoZW1hcy52ZXJpZGEuaW8vaGVhbHRoL3BhdGhvbG9neS90ZXN0cy9jb3ZpZDE5L3Bjci92MC4xLjAvc2NoZW1hLmpzb24iLCJ0eXBlIjoiSnNvblNjaGVtYVZhbGlkYXRvcjIwMTgifX0sImlzcyI6ImRpZDp2ZGE6MHhCMzcyOTk4MkEyNTg1NTQ0RkQ3MmM5OUNGMzc3M2E5YzZiYUJENTVjIn0.F9rk2VRz042tQOygU6VuI9NOyTQYYqPcbdfqUPYTvvZ1vx8gIqllSKqZHivpqnWoCB3zyzXKiG1KEHSpHrZYlg'
}

didJwtVc is a DID-JWT Verifiable Credential generated using the did-jwt-vc library.

Verify a Credential

It is possible to manually verify the didJwtVc string to extract the verifiable credential object.

import Credentials from "@verida/verifiable-credentials";

// Note: `context` should already be obtained by connecting to the Verida Network
const credentialSDK = new Credentials(context);

const decodedCredential = await credential.verifyCredential(jwt.didJwtVc)

Returned decodedCredential object:

{
  payload: {
    vc: {
      '@context': [Array],
      sub: 'did:vda:polamoy:0xC2629982A2585544FD72c99CF3773a9c6baBD55c',
      type: [Array],
      issuer: 'did:vda:polamoy:0xB3729982A2585544FD72c99CF3773a9c6baBD55c',
      issuanceDate: '2022-03-08T23:25:31.097Z',
      credentialSubject: [Object],
      credentialSchema: [Object]
    },
    iss: 'did:vda:polamoy:0xB3729982A2585544FD72c99CF3773a9c6baBD55c'
  },
  didResolutionResult: {
    didDocument: {
      id: 'did:vda:polamoy:0xb3729982a2585544fd72c99cf3773a9c6babd55c',
      controller: 'did:vda:polamoy:0xb3729982a2585544fd72c99cf3773a9c6babd55c',
      assertionMethod: [Array],
      verificationMethod: [Array],
      service: [Array],
      keyAgreement: [Array],
      proof: [Object]
    },
    didDocumentMetadata: {},
    didResolutionMetadata: { contentType: 'application/did+json' }
  },
  issuer: 'did:vda:polamoy:0xB3729982A2585544FD72c99CF3773a9c6baBD55c',
  signer: {
    id: 'did:vda:polamoy:0xb3729982a2585544fd72c99cf3773a9c6babd55c?context=0x046184d17aeff3bfc319b38e4fc38a922a4021c6a21fd478268d33a3a8fa2b01#sign',
    type: 'EcdsaSecp256k1VerificationKey2019',
    controller: 'did:vda:polamoy:0xb3729982a2585544fd72c99cf3773a9c6babd55c',
    publicKeyHex: '0x0219d9d875c4349ed4420ccd681e91defc796ca7c9a0ba39024c8743ccd4372442'
  },
  jwt: 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sInN1YiI6ImRpZDp2ZGE6MHhDMjYyOTk4MkEyNTg1NTQ0RkQ3MmM5OUNGMzc3M2E5YzZiYUJENTVjIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOiJkaWQ6dmRhOjB4QjM3Mjk5ODJBMjU4NTU0NEZENzJjOTlDRjM3NzNhOWM2YmFCRDU1YyIsImlzc3VhbmNlRGF0ZSI6IjIwMjItMDMtMDhUMjM6MjU6MzEuMDk3WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImZ1bGxOYW1lIjoiSmFuZSBEb2UiLCJkYXRlT2ZCaXJ0aCI6IjE5OTItMDctMDMiLCJwYXRpZW50SWQiOiJBQkMxMjMiLCJ0ZXN0VGltZXN0YW1wIjoiMjAyMi0wMy0wMVQxMDozMDowNS40MzVaIiwicmVzdWx0IjoiTmVnYXRpdmUiLCJzY2hlbWEiOiJodHRwczovL2NvbW1vbi5zY2hlbWFzLnZlcmlkYS5pby9oZWFsdGgvcGF0aG9sb2d5L3Rlc3RzL2NvdmlkMTkvcGNyL3YwLjEuMC9zY2hlbWEuanNvbiJ9LCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9jb21tb24uc2NoZW1hcy52ZXJpZGEuaW8vaGVhbHRoL3BhdGhvbG9neS90ZXN0cy9jb3ZpZDE5L3Bjci92MC4xLjAvc2NoZW1hLmpzb24iLCJ0eXBlIjoiSnNvblNjaGVtYVZhbGlkYXRvcjIwMTgifX0sImlzcyI6ImRpZDp2ZGE6MHhCMzcyOTk4MkEyNTg1NTQ0RkQ3MmM5OUNGMzc3M2E5YzZiYUJENTVjIn0.j8JpTTndAUGEGEx0BcnXBjCIOCDPBuY48H8nj_S_og80ainE7gYNLNBd-I7Xdz73P-yEjFO01kY6tgd5wc0p4w',
  verifiableCredential: {
    vc: {
      sub: 'did:vda:polamoy:0xC2629982A2585544FD72c99CF3773a9c6baBD55c',
      issuer: 'did:vda:polamoy:0xB3729982A2585544FD72c99CF3773a9c6baBD55c',
      issuanceDate: '2022-03-08T23:25:31.097Z'
    },
    credentialSubject: {
      "finClusiveId": "12345",
      "gender": "male",
      "firstName": "Chris",
      "lastName": "Tester",
      "streetAddress1": "123 Four Ave",
      "suburb": "Adelaide",
      "state": "SA",
      "postcode": "5000",
      "dateOfBirth": "2000-01-01"
    },
    issuer: { id: 'did:vda:polamoy:0xB3729982A2585544FD72c99CF3773a9c6baBD55c' },
    type: [ 'VerifiableCredential' ],
    credentialSchema: {
      id: 'https://common.schemas.verida.io/identity/kyc/FinClusive/individual-basic/latest/schema.json',
      type: 'JsonSchemaValidator2018'
    },
    '@context': [
      'https://www.w3.org/2018/credentials/v1',
      'https://www.w3.org/2018/credentials/examples/v1'
    ],
    proof: {
      type: 'JwtProof2020',
      jwt: 'eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIl0sInN1YiI6ImRpZDp2ZGE6MHhDMjYyOTk4MkEyNTg1NTQ0RkQ3MmM5OUNGMzc3M2E5YzZiYUJENTVjIiwidHlwZSI6WyJWZXJpZmlhYmxlQ3JlZGVudGlhbCJdLCJpc3N1ZXIiOiJkaWQ6dmRhOjB4QjM3Mjk5ODJBMjU4NTU0NEZENzJjOTlDRjM3NzNhOWM2YmFCRDU1YyIsImlzc3VhbmNlRGF0ZSI6IjIwMjItMDMtMDhUMjM6MjU6MzEuMDk3WiIsImNyZWRlbnRpYWxTdWJqZWN0Ijp7ImZ1bGxOYW1lIjoiSmFuZSBEb2UiLCJkYXRlT2ZCaXJ0aCI6IjE5OTItMDctMDMiLCJwYXRpZW50SWQiOiJBQkMxMjMiLCJ0ZXN0VGltZXN0YW1wIjoiMjAyMi0wMy0wMVQxMDozMDowNS40MzVaIiwicmVzdWx0IjoiTmVnYXRpdmUiLCJzY2hlbWEiOiJodHRwczovL2NvbW1vbi5zY2hlbWFzLnZlcmlkYS5pby9oZWFsdGgvcGF0aG9sb2d5L3Rlc3RzL2NvdmlkMTkvcGNyL3YwLjEuMC9zY2hlbWEuanNvbiJ9LCJjcmVkZW50aWFsU2NoZW1hIjp7ImlkIjoiaHR0cHM6Ly9jb21tb24uc2NoZW1hcy52ZXJpZGEuaW8vaGVhbHRoL3BhdGhvbG9neS90ZXN0cy9jb3ZpZDE5L3Bjci92MC4xLjAvc2NoZW1hLmpzb24iLCJ0eXBlIjoiSnNvblNjaGVtYVZhbGlkYXRvcjIwMTgifX0sImlzcyI6ImRpZDp2ZGE6MHhCMzcyOTk4MkEyNTg1NTQ0RkQ3MmM5OUNGMzc3M2E5YzZiYUJENTVjIn0.j8JpTTndAUGEGEx0BcnXBjCIOCDPBuY48H8nj_S_og80ainE7gYNLNBd-I7Xdz73P-yEjFO01kY6tgd5wc0p4w'
    }
  }
}

Present a Credential

There is a specific process to "present" a credential, which wraps the verifiable credential data within a presentation object. The standard allows a credential holder to present multiple credentials at once.

// Note: `context` should already be obtained by connecting to the Verida Network
const credentialSDK = new Credentials(context);

// Create a presentation with one or more `didJwtVc` strings
const vcPresentation = credentialSDK.createVerifiablePresentation([credential.didJwtVc])

Sharing a Credential

A credential holder can share a credential stored in their Verida Account in several ways:

  1. Generate a shareable URL (this is implemented in the Verida Wallet when viewing a credential where the URL is embedded in a QR code)
  2. Send the credential via the Verida Messaging system (this is implemented in the Verida Wallet via request and send an inbox message)
  3. Make the credential public via their public credential Datastore

URL credential sharing

The SharingCredential library takes a private credential object and makes it available via a public Verida URI for any third party to access. In order to protect privacy, the credential is encrypted so any third party must be supplied the encryption key in order to access the credential.

import { SharingCredential } from "@verida/verifiable-credentials";

// `credential` is a credential previously created with credentialSDK.createCredentialJWT()
const shareData = await shareCredential.issueEncryptedPresentation(credential);

Returned shareData object:

{
  // Encrypted credential that is stored in the public credential database located at `veridaUri`
  item: {
    content: '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',
    schema: 'https://common.schemas.verida.io/credential/public/encrypted/v0.1.0/schema.json'
  },
  // The result object returned from the public credential database
  result: {
    ok: true,
    id: '876ec340-9f3c-11ec-a4d8-35d2dca04a1c',
    rev: '1-b1b26bc16dbac1ee0b1db2afffe7daaa'
  },
  // The DID of the Verida Account that is sharing the credential
  did: 'did:vda:polamoy:0xB3729982A2585544FD72c99CF3773a9c6baBD55c',
  // The Verida URI endpoint pointing to where the encrypted credential is stored
  // verida://<did>/base64(<contextName>)/<databaseName>/recordId?key=<encryptionKey>
  veridaUri: 'verida://did:vda:polamoy:0xB3729982A2585544FD72c99CF3773a9c6baBD55c/GpNDePvWU4RQud9jaZJiNwFyAS/credential_public_encrypted/876ec340-9f3c-11ec-a4d8-35d2dca04a1c?key=c8fd78a9baa44c8ade5e269e0310dcf1139d0374980110b4802b5db6e0820543',
  // A public URI that can be opened in a web browser that can decode a base64 encoded veridaUri, fetch the data, decrypt it and display to the viewer
  publicUri: 'https://explorer.verida.network/credential?uri=dmVyaWRhOi8vZGlkOnZkYToweEIzNzI5OTgyQTI1ODU1NDRGRDcyYzk5Q0YzNzczYTljNmJhQkQ1NWMvR3BORGVQdldVNFJRdWQ5amFaSmlOd0Z5QVMvY3JlZGVudGlhbF9wdWJsaWNfZW5jcnlwdGVkLzg3NmVjMzQwLTlmM2MtMTFlYy1hNGQ4LTM1ZDJkY2EwNGExYz9rZXk9YzhmZDc4YTliYWE0NGM4YWRlNWUyNjllMDMxMGRjZjExMzlkMDM3NDk4MDExMGI0ODAyYjVkYjZlMDgyMDU0Mw=='
}

publicUri can be shared with anyone who can then open the credential in their web browser.

veridaUri can be shared with other systems to access the underlying credential data.

Send via Verida Messaging

The credential object created by an issuer can be sent to a Verida Account via their Vault.

See Client SDK: Messaging

Blockchain proofs

The credential SDK supports the concept of Blockchain proofs that are certain attributes of a credential that are collectively signed in such a way as they can be quickly and cheaply verified on a blockchain.

For example, it is possible to issue a Verifiable Credential proving someones credit score, but then provide a blockchain proof specifying the value of the credit score. This would allow the credit score to be used in a smart contract (or issued as a Soulbound token) without requiring the full verifiable credential to be parsed on chain (which is very expensive).

Blockchain proofs are defined in the credential schema.

See this example from FinClusive/individual-basic which defines a finclusive/individual-kyc proof:

"veridaProofs": {
    "finclusive/individual-kyc": ["finclusive/individual-basic-kyc", "$finClusiveId"]
},

Here is the proof named finclusive/individual-kyc consists of a proof string that combines two attributes:

  1. The unaltered string finclusive/individual-basic-kyc
  2. The value of the credential for the variale finClusiveId

These two attributes will be joined with the - character.

The $ parameter indicates the value of the credential should be included.

The proof string that will be signed (usingthe example credential above):

finclusive/individual-kyc-12345

When the Verida SDK generates a credential, it will include a proofs attribute in the payload containing an array of signatures for each veridaProof.

These proofs can then be verified on chain using the Verida Personal Data Bridge

Credential Schemas

Within the Verida network each credential is a data object (represented as JSON) that matches a particular credential schema.

Here is an example of a working credential schema Identity / KYC / FinClusive / Individual (Basic)

You can create your own schemas.

info

Schemas should be hosted on a publicly available web host that sets the Access-Control-Allow-Origin CORS header. Read more here.

Verida Wallet

Credentials stored with the credential schema will automatically be rendered in the Verida Wallet as a credential. This custom display includes:

  1. A scannable QR code
  2. The profile icon of the Verida DID that issued/signed the credential
  3. A tick of approval indicating the credential has been verified

Setting the signer avatar

The Verida Wallet will automatically show the public profile icon of the Verida Account that signed the credential. You will need to set this icon for your Verida account so the icon displays correctly.

You could add the signing Verida Account to the Verida Wallet and use the mobile app to set a profile avatar and name. This will then be the default for every inbox message and credential issued across the Verida network. Alternatively, you could manually set the profile information for the application context generating the credential. See Account Profiles for more information on how to achieve this.