diff --git a/packages/builder/src/components/providers/identity/__tests__/credentials.test.ts b/packages/builder/src/components/providers/identity/__tests__/credentials.test.ts index 06c41629aa..0dc2312a33 100644 --- a/packages/builder/src/components/providers/identity/__tests__/credentials.test.ts +++ b/packages/builder/src/components/providers/identity/__tests__/credentials.test.ts @@ -21,6 +21,7 @@ describe("Fetch Credentials", () => { const payload: GHOrgRequestPayload = { address: "0x0", type: "Simple", + types: [], version: "Test-Case-1", org: "gitcoinco", }; @@ -71,7 +72,7 @@ describe("Fetch Credentials", () => { if (url.includes("verify")) { return { - data: MOCK_VERIFY_RESPONSE_BODY, + data: [MOCK_VERIFY_RESPONSE_BODY], }; } @@ -102,13 +103,15 @@ describe("Fetch Credentials", () => { it("will not attempt to sign if not provided a challenge in the challenge credential", async () => { jest.spyOn(axios, "post").mockResolvedValueOnce({ - data: { - credential: { - credentialSubject: { - challenge: null, + data: [ + { + credential: { + credentialSubject: { + challenge: null, + }, }, }, - }, + ], }); await expect( diff --git a/packages/builder/src/components/providers/identity/credentials.ts b/packages/builder/src/components/providers/identity/credentials.ts index aafa6a9661..da576098a9 100644 --- a/packages/builder/src/components/providers/identity/credentials.ts +++ b/packages/builder/src/components/providers/identity/credentials.ts @@ -4,7 +4,9 @@ import { RequestPayload, IssuedChallenge, VerifiableCredentialRecord, + VerifiableCredential, } from "@gitcoinco/passport-sdk-types"; +import { CredentialProvider } from "../../../types"; export type { VerifiableCredential } from "@gitcoinco/passport-sdk-types"; @@ -37,6 +39,8 @@ export enum ClientType { } export type GHOrgRequestPayload = RequestPayload & { + type: string; + types: CredentialProvider[]; requestedClient?: ClientType.GrantHub; org?: string; }; @@ -51,7 +55,7 @@ export class VerificationError extends Error { // Fetch a verifiableCredential export const fetchVerifiableCredential = async ( iamUrl: string, - payload: any, + payload: GHOrgRequestPayload, signer: { signMessage: (message: string) => Promise } ): Promise => { // first pull a challenge that can be signed by the user @@ -74,20 +78,29 @@ export const fetchVerifiableCredential = async ( payload.proofs = { ...payload.proofs, ...{ signature } }; // fetch a credential from the API that fits the version, payload and passes the signature message challenge - const response = await axios.post( + const response = (await axios.post( `${iamUrl.replace(/\/*?$/, "")}/v${payload.version}/verify`, { payload, challenge, } - ); + )) as { + data: { + record: VerifiableCredentialRecord["record"]; + credential: VerifiableCredential; + }[]; + }; + + if (response.data.length === 0) { + throw new VerificationError("No credential found"); + } // return everything that was used to create the credential (along with the credential) return { signature, challenge, - record: response?.data.record, - credential: response?.data.credential, + record: response.data[0].record, + credential: response.data[0].credential, } as VerifiableCredentialRecord; };