Credential Issuance

Issue a Verifiable Credentials using Credential Issuance Service.

Install Dependency

Package: affinidi_tdk_credential_issuance_client

  dart pub add affinidi_tdk_credential_issuance_client

Check the latest version on pub.dev or view the source on GitHub.

Classes and Methods

Configuration API

Manage the issuance configuration for the project. Project only one issuance configuration.

createIssuanceConfig

Create an issuance configuration for the project.

Parameters

createIssuanceConfigInput CreateIssuanceConfigInput Required
Details of the issuance configuration to create.

Example

import 'package:dio/dio.dart';
import 'package:built_collection/built_collection.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

      final name = "TestConfig";
      final description = "Test issuance config";
      final format = CreateIssuanceConfigInputFormatEnum.ldpVc;
      final credentialOfferDuration = 600;
      final metadata = SupportedCredentialMetadataBuilder()
        ..display = ListBuilder([
          SupportedCredentialMetadataDisplayInner((b) => b
            ..name = "Test Display"
            ..logo = (SupportedCredentialMetadataItemLogoBuilder()
              ..url = "https://example.com/logo.png"
              ..altText = "Logo"))
        ]);

        final credentialSupported = [
        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaOne"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaOne.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaOne.jsonld"
          ..metadata = metadata),

        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaTwo"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaTwo.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaTwo.jsonld"
          ..metadata = metadata),

        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaThree"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaThree.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaThree.jsonld"
          ..metadata = metadata),

        CredentialSupportedObject((b) => b
          ..credentialTypeId = "SchemaFour"
          ..jsonSchemaUrl = "https://schema.affinidi.io/SchemaFour.json"
          ..jsonLdContextUrl = "https://schema.affinidi.io/SchemaFour.jsonld"
          ..metadata = metadata),
      ];

      final configInputBuilder = CreateIssuanceConfigInputBuilder()
        ..issuerWalletId = "<WALLET_ID>"
        ..name = name
        ..description = description
        ..format = format
        ..credentialOfferDuration = credentialOfferDuration
        ..credentialSupported = ListBuilder(credentialSupported);

      final response = (await configurationApi.createIssuanceConfig(createIssuanceConfigInput: configInputBuilder.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

deleteIssuanceConfigById

Delete the issuance configuration by ID.

Parameters

configurationId String Required
ID of the issuance configuration to delete.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final configurationId = "<CONFIG_ID>";

    final response = (await configurationApi.deleteIssuanceConfigById(configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

getIssuanceConfigById

Retrieves the issuance configuration details by ID.

Parameters

configurationId String Required
ID of the issuance configuration to retrieve.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final configurationId = "<CONFIG_ID>";

    final response = (await configurationApi.getIssuanceConfigById(configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

getIssuanceConfigList

Get the list of issuance configurations for the current project.

No parameters required.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final response = (await configurationApi.getIssuanceConfigList());

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

updateIssuanceConfigById

Update the existing issuance configuration by ID.

Parameters

configurationId String Required
ID of the issuance configuration to update.
updateIssuanceConfigInput UpdateIssuanceConfigInput Required
Details to update in the issuance configuration.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late ConfigurationApi configurationApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      configurationApi = issuanceClient.getConfigurationApi();

    final String updatedDescription = 'UpdatedDescription';
    final configurationId = "<CONFIG_ID>";

    final updateIssuanceConfigInput = UpdateIssuanceConfigInputBuilder()
        ..description = updatedDescription;

    final response = (await configurationApi.updateIssuanceConfigById(configurationId: configurationId, updateIssuanceConfigInput: updateIssuanceConfigInput.build())).data;

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

Issuance API

Use to initiate issuance of the credential and check the status.

issuanceState

Retrieve the status of issuance.

Parameters

issuanceId String Required
ID of the initiated issuance.
projectId String Required
Project ID from where the issuance was initiated.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late IssuanceApi issuanceApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      issuanceApi = issuanceClient.getIssuanceApi();

    final issuanceId = "<ISSUANCE_ID>";
    final projectId = "<PROJECT_ID>";

    final response = (await issuanceApi.issuanceState(issuanceId: issuanceId, projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

listIssuance

Get the list of issuances initiated in the project.

Parameters

projectId String Required
Project ID from where to list the issuances.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late IssuanceApi issuanceApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      issuanceApi = issuanceClient.getIssuanceApi();

    final projectId = "<PROJECT_ID>";

    final response = (await issuanceApi.listIssuance(projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

startIssuance

Initiate the issuance of a credential.

Parameters

projectId String Required
Project ID from where to initiate the issuance.
startIssuanceInput StartIssuanceInput Required
Details of the credentials to issue.

Example

import 'package:built_collection/built_collection.dart';
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';
import 'package:built_value/json_object.dart';

try {

    late IssuanceApi issuanceApi;

    final issuanceClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      issuanceApi = issuanceClient.getIssuanceApi();

      final projectId =  "<PROJECT_ID>";
      final credentialTypeId = "SchemaOne";

      final credentialData = {
         "first_name": "FirstName",
         "last_name": "LastName",
         "dob": "1970-01-01",
      };

      final credentialDataBuilder = MapBuilder<String, JsonObject>(credentialData.map((key, value) => MapEntry(key, JsonObject(value))),);

      final data = StartIssuanceInputDataInnerBuilder()
        ..credentialTypeId = credentialTypeId
        ..credentialData.replace(credentialDataBuilder.build());

      final startIssuanceInput = StartIssuanceInputBuilder()
         ..holderDid = "did:key:holder-did-value"
         ..claimMode = StartIssuanceInputClaimModeEnum.FIXED_HOLDER
         ..data = ListBuilder<StartIssuanceInputDataInner>([data.build()]);

      final response = (await issuanceApi.startIssuance(projectId: projectId, startIssuanceInput: startIssuanceInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

Credentials API

Issue a Verifiable Credentials to the users.

batchCredential

Allow digital wallets to claim multiple credentials at once.

Parameters

projectId String Required
Project ID from where you want to issue the credential.
batchCredentialInput BatchCredentialInput Required
Details of the credentials to generate.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late CredentialsApi credentialsApi;

    final credentialsClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      credentialsApi = credentialsClient.getCredentialsApi();

    final projectId =  "<PROJECT_ID>";
    
    final proofType = CredentialProofProofTypeEnum.jwt;

    final proof = CredentialProofBuilder()
       ..proofType = proofType
       ..jwt = '<PROOF_JWT>';

    final credentialRequests = ListBuilder<BatchCredentialInputCredentialRequestsInner>();

    credentialRequests.add(
      BatchCredentialInputCredentialRequestsInner((b) => b
        ..credentialIdentifier = "credential_identifier"
        ..proof = proof));

    final batchCredentialInput = BatchCredentialInputBuilder()
        ..credentialRequests = credentialRequests;
        
    final response = (await credentialsApi.batchCredential(
      projectId: projectId, batchCredentialInput : batchCredentialInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

generateCredentials

Generate and issue a credential offer to the user.

Parameters

projectId String Required
Project ID from where you want to issue the credential.
createCredentialInput CreateCredentialInput Required
Details of the credential to generate.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late CredentialsApi credentialsApi;

    final credentialsClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      credentialsApi = credentialsClient.getCredentialsApi();

    final projectId =  "<PROJECT_ID>";
    
    final proofType = CredentialProofProofTypeEnum.jwt; 

    final proof = CredentialProofBuilder()
     .. proofType = proofType
     .. jwt = '<PROOF_JWT>';

    final createCredentialInput = CreateCredentialInputBuilder()
      ..credentialIdentifier = "UniversityDegree-2024"
      ..proof = proof;

    final response = (await credentialsApi.generateCredentials(projectId: projectId, createCredentialInput: createCredentialInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

getClaimedCredentials

Get claimed credentials in the specified range.

Parameters

projectId String Required
Project ID from where credentials were claimed.
configurationId String Required
Configuration ID for the issuance.
rangeStartTime String Optional
Start of the date range to filter credentials.
rangeEndTime String Optional
End of the date range to filter credentials.
exclusiveStartKey String Optional
Pagination key for the next page of results.
limit Integer Optional
Maximum number of records to return.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late CredentialsApi credentialsApi;

    final credentialsClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      credentialsApi = credentialsClient.getCredentialsApi();

    final projectId =  "<PROJECT_ID>";
    final configurationId =  "<CONFIG_ID>";
    final rangeStartTime =  "<START_DATE>";
    final rangeEndTime   =  "<END_DATE>";
    final exclusiveStartKey =  "<exclusiveStartKey>";
    final limit =  10;

    final response = (await credentialsApi.getClaimedCredentials(
      projectId: projectId, configurationId : configurationId, rangeStartTime : rangeStartTime, rangeEndTime : rangeEndTime, exclusiveStartKey : exclusiveStartKey, limit: limit));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

Default API

Revoke a revocable Verifiable Credentials issued to the users.

changeCredentialStatus

Updates the status of the credential (e.g., REVOKED).

Parameters

projectId String Required
Project ID from where the credential is issued.
configurationId String Required
Configuration ID from where the credential is issued.
changeCredentialStatusInput ChangeCredentialStatusInput Required
Details of the credential to revoke.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late DefaultApi defaultApi;

    final defaultClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      defaultApi = defaultClient.getDefaultApi();

    final projectId = "<PROJECT_ID>";
    final configurationId = "<CONFIG_ID>";

    final changeCredentialStatusInput = ChangeCredentialStatusInputBuilder()
      ..changeReason = ChangeCredentialStatusInputChangeReasonEnum.INVALID_CREDENTIAL;

    final response = (await defaultApi.changeCredentialStatus(projectId: projectId, configurationId: configurationId, changeCredentialStatusInput: changeCredentialStatusInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

listIssuanceDataRecords

Retrieves the list of records of revocable credentials.

Parameters

projectId String Required
Project ID from where the credential is issued.
configurationId String Required
Configuration ID from where the credential is issued.
limit Integer Optional
Maximum number of records to fetch in a list.
exclusiveStartKey String Optional
The base64url encoded key of the first item this operation will evaluate.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late DefaultApi defaultApi;

    final defaultClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      defaultApi = defaultClient.getDefaultApi();

    final projectId = "<PROJECT_ID>";
    final configurationId = "<CONFIG_ID>";

    final response = (await defaultApi.listIssuanceDataRecords(projectId: projectId, configurationId: configurationId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

Offer API

Used to get the credential offer initiated by the Issuance API.

getCredentialOffer

Retrieves the credential offer details.

Parameters

projectId String Required
Project ID from where the credential is issued.
issuanceId String Required
ID of the issuance initiated.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late OfferApi offerApi;

    final offerClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      offerApi = offerClient.getOfferApi();

    final projectId = "<PROJECT_ID>";
    final issuanceId = "<ISSUANCE_ID>";

    final response = (await offerApi.getCredentialOffer(issuanceId: issuanceId, projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }

WellKnown API

Used to get the WellKnown OpenID Credential Issuer information.

getWellKnownOpenIdCredentialIssuer

Retrieves the credential issuer well-known configurations.

Parameters

projectId String Required
Project ID from where the credential is issued.

Example

import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_credential_issuance_client/affinidi_tdk_credential_issuance_client.dart';
import 'package:dotenv/dotenv.dart';

try {

    late WellKnownApi wellKnownApi;

    final wellKnownClient = AffinidiTdkCredentialIssuanceClient(
        dio: Dio(BaseOptions(
          baseUrl: AffinidiTdkCredentialIssuanceClient.basePath,
          connectTimeout: const Duration(seconds: 10),
          receiveTimeout: const Duration(seconds: 10),
        )),
        authTokenHook: authProvider.fetchProjectScopedToken);

      wellKnownApi = wellKnownClient.getWellKnownApi();

    final projectId = "<PROJECT_ID>";

    final response = (await wellKnownApi.getWellKnownOpenIdCredentialIssuer(projectId: projectId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }