Skip to main content

How it works using OpenID Credential Provisioning

Initialise a wallet instance


import { initialise } from "@mattrglobal/wallet-sdk-react-native";

const initialiseWalletResult = await initialise();

if (initialiseWalletResult.isErr()) {
// Handle error from initialiseWalletResult.error
return;
}

const wallet = initialiseWalletResult.value;

It's possible to maintain multiple isolated wallet instances too. This can be achieved by using a different walletId during initialisation. Note that in this case, you must close the current wallet instance before initialising a new one with a different walletId.


import { initialise } from "@mattrglobal/wallet-sdk-react-native";

// to use wallet1
const initialiseWallet1Result = await initialise({ walletId: "id1" });

if (initialiseWallet1Result.isErr()) {
// Handle error from initialiseWalletResult.error
return;
}
const wallet1 = initialiseWallet1Result.value;

// to use wallet2
await wallet1.close();
const initialiseWallet2Result = await initialise({ walletId: "id2" });
const wallet2 = initialiseWallet1Result.value;

Destroy the wallet


import { destroy } from "@mattrglobal/wallet-sdk-react-native";

await wallet.destroy({ walletId });

Start an OpenID Credential Provisioning flow

Discover OpenID credential offer


const uri =
"openid-credential-offer://?credential_offer=%7B%22credential_issuer%22
%3A%22https%3A%2F%2Fmyissuer.example.com%22%2C%22credentials%22%3A%5B%
22707e920a-f342-443b-ae24-6946b7b5033e%22%5D%2C%22request_parameters%22
%3A%7B%22login_hint%22%3A%22test.user%40example.com%22%2C%22prompt%22%
3A%22login%22%7D%7D";

const discoveryResult = await wallet.openid.issuance.discover(uri);
if (discoveryResult.isErr()) {
// Handle error from discoveryResult.error
}
const { offer } = discoveryResult.value;

or Construct the offer manually


const offer: OpenidIssuanceCredentialOffer = {
issuer: "https://example.com/",
authorizeEndpoint: "https://example.com/oauth/authorize",
tokenEndpoint: "https://example.com/oauth/token",
credentialEndpoint: "https://example.com/oauth/credential",
credentials: [
{
profile: "web-semantic",
scope: "ldp_vc:UniversityDegreeCredential",
credentialDefinition: {
"@context": ["https://www.w3.org/2018/credentials/v1"],
type: ["VerifiableCredential", "UniversityDegreeCredential"],
}
},
{
profile: "compact",
scope: "cwt:UniversityDegreeCredential",
type: "UniversityDegreeCredential",
},
{
profile: "compact-semantic",
scope: "cwt_vc:UniversityDegreeCredential",
types: ["UniversityDegreeCredential", "VerifiableCredential"]
},
],
}

Generate an OAuth authorization url to request access token to retrieve the credentials


import { Linking } from "react-native";

const generateAuthorizeUrlResult = await wallet.openid.issuance.generateAuthorizeUrl({ offer, clientId, redirectUri });

if (generateAuthorizeUrlResult.isErr()) {
// Handle error from generateAuthorizeUrlResult.error
return;
}

const { url, codeVerifier } = generateAuthorizeUrlResult.value;
await Linking.openURL(url);

Retrieve the credential on authorization success callback


const retrieveResult = (retrieveCredential = await wallet.oidc.retrieveCredential({
offer,
codeVerifier,
nonce,
code: route.params.code, // code comes from part of the callback url
}));

if (retrieveResult.isErr()) {
// Handle error from retrieveResult.error
return;
}

const { credential } = retrieveResult.value;

Retrieve the token


const retrieveTokenResult = await wallet.openid.issuance.retrieveToken({
offer,
clientId,
redirectUri,
codeVerifier,
code: route.params.code, // code comes authorization success callback above
});

if (retrieveTokenResult.isErr()) {
// Handle error from retrieveTokenResult.error
return;
}

const { accessToken } = retrieveTokenResult.value;

Retrieve credentials


const retrieveCredentialsResult = await wallet.openid.issuance.retrieveCredentials({
offer,
accessToken,
clientId,
});

retrieveCredentialsResult.forEach((credentialOfferResult) => {
if ("error" in credentialOfferResult) {
const { offer, error } = credentialOfferResult;

// Handle error from retrieveCredentialsResult.error
} else {
const { offer, result } = credentialOfferResult;
}
});

Verify a Web credential


const verifyResult = await wallet.credential.webSemantic.verifyCredential({ credential });

if (verifyResult.isErr()) {
// Handle error from verifyResult.error
return;
}

const { credentialVerified, status } = verifyResult.value;

Verify a Compact credential


const verifyResult = await wallet.credential.compact.verifyCredential({ credential });

if (verifyResult.isErr()) {
// Handle error from verifyResult.error
return;
}

const { credentialVerified, status } = verifyResult.value;

Verify a Compact Semantic credential


const verifyResult = await wallet.credential.compactSemantic.verifyCredential({ credential });

if (verifyResult.isErr()) {
// Handle error from verifyResult.error
return;
}

const { credentialVerified, status } = verifyResult.value;

Find the comprehensive SDK interfaces for these examples and others in the documentation https://github.com/mattrglobal/docs-wallet-sdk.

Get in touch if you wish to find out more about using the Wallet SDK in production.