@sphereon/oid4vci-client 0.2.0 → 0.4.1-next.285
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -201
- package/README.md +494 -371
- package/dist/AccessTokenClient.d.ts +30 -0
- package/dist/AccessTokenClient.d.ts.map +1 -0
- package/dist/AccessTokenClient.js +222 -0
- package/dist/AccessTokenClient.js.map +1 -0
- package/dist/AuthorizationDetailsBuilder.d.ts +11 -0
- package/dist/AuthorizationDetailsBuilder.d.ts.map +1 -0
- package/dist/AuthorizationDetailsBuilder.js +44 -0
- package/dist/AuthorizationDetailsBuilder.js.map +1 -0
- package/dist/CredentialOfferClient.d.ts +10 -0
- package/dist/CredentialOfferClient.d.ts.map +1 -0
- package/dist/CredentialOfferClient.js +101 -0
- package/dist/CredentialOfferClient.js.map +1 -0
- package/dist/CredentialRequestClient.d.ts +33 -0
- package/dist/CredentialRequestClient.d.ts.map +1 -0
- package/dist/CredentialRequestClient.js +118 -0
- package/dist/CredentialRequestClient.js.map +1 -0
- package/dist/CredentialRequestClientBuilder.d.ts +34 -0
- package/dist/CredentialRequestClientBuilder.d.ts.map +1 -0
- package/dist/CredentialRequestClientBuilder.js +87 -0
- package/dist/CredentialRequestClientBuilder.js.map +1 -0
- package/dist/{main/lib/MetadataClient.d.ts → MetadataClient.d.ts} +39 -38
- package/dist/MetadataClient.d.ts.map +1 -0
- package/dist/MetadataClient.js +148 -0
- package/dist/MetadataClient.js.map +1 -0
- package/dist/OpenID4VCIClient.d.ts +75 -0
- package/dist/OpenID4VCIClient.d.ts.map +1 -0
- package/dist/OpenID4VCIClient.js +403 -0
- package/dist/OpenID4VCIClient.js.map +1 -0
- package/dist/ProofOfPossessionBuilder.d.ts +38 -0
- package/dist/ProofOfPossessionBuilder.d.ts.map +1 -0
- package/dist/ProofOfPossessionBuilder.js +129 -0
- package/dist/ProofOfPossessionBuilder.js.map +1 -0
- package/dist/functions/ProofUtil.d.ts +29 -0
- package/dist/functions/ProofUtil.d.ts.map +1 -0
- package/dist/functions/ProofUtil.js +104 -0
- package/dist/functions/ProofUtil.js.map +1 -0
- package/dist/functions/index.d.ts +4 -0
- package/dist/functions/index.d.ts.map +1 -0
- package/dist/{main → functions}/index.js +20 -18
- package/dist/functions/index.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/{main/lib/index.js → index.js} +25 -24
- package/dist/index.js.map +1 -0
- package/lib/AccessTokenClient.ts +249 -0
- package/lib/AuthorizationDetailsBuilder.ts +46 -0
- package/lib/CredentialOfferClient.ts +108 -0
- package/lib/CredentialRequestClient.ts +137 -0
- package/lib/CredentialRequestClientBuilder.ts +110 -0
- package/lib/MetadataClient.ts +147 -0
- package/lib/OpenID4VCIClient.ts +523 -0
- package/lib/ProofOfPossessionBuilder.ts +181 -0
- package/lib/__tests__/AccessTokenClient.spec.ts +225 -0
- package/lib/__tests__/AuthorizationDetailsBuilder.spec.ts +65 -0
- package/lib/__tests__/AuthzFlowType.spec.ts +39 -0
- package/lib/__tests__/CredentialRequestClient.spec.ts +291 -0
- package/lib/__tests__/CredentialRequestClientBuilder.spec.ts +121 -0
- package/lib/__tests__/HttpUtils.spec.ts +37 -0
- package/lib/__tests__/IT.spec.ts +173 -0
- package/lib/__tests__/IssuanceInitiation.spec.ts +48 -0
- package/lib/__tests__/JsonURIConversions.spec.ts +146 -0
- package/lib/__tests__/MetadataClient.spec.ts +203 -0
- package/lib/__tests__/MetadataMocks.ts +444 -0
- package/lib/__tests__/OpenID4VCIClient.spec.ts +166 -0
- package/lib/__tests__/OpenID4VCIClientPAR.spec.ts +112 -0
- package/lib/__tests__/ProofOfPossessionBuilder.spec.ts +110 -0
- package/lib/__tests__/data/VciDataFixtures.ts +744 -0
- package/lib/functions/ProofUtil.ts +120 -0
- package/lib/functions/index.ts +3 -0
- package/{dist/main/lib/index.d.ts → lib/index.ts} +8 -7
- package/package.json +68 -71
- package/CHANGELOG.md +0 -21
- package/dist/main/index.d.ts +0 -1
- package/dist/main/lib/AccessTokenClient.d.ts +0 -20
- package/dist/main/lib/AccessTokenClient.js +0 -141
- package/dist/main/lib/CredentialRequestClient.d.ts +0 -31
- package/dist/main/lib/CredentialRequestClient.js +0 -66
- package/dist/main/lib/CredentialRequestClientBuilder.d.ts +0 -21
- package/dist/main/lib/CredentialRequestClientBuilder.js +0 -56
- package/dist/main/lib/IssuanceInitiation.d.ts +0 -5
- package/dist/main/lib/IssuanceInitiation.js +0 -29
- package/dist/main/lib/MetadataClient.js +0 -127
- package/dist/main/lib/functions/Encoding.d.ts +0 -17
- package/dist/main/lib/functions/Encoding.js +0 -138
- package/dist/main/lib/functions/HttpUtils.d.ts +0 -17
- package/dist/main/lib/functions/HttpUtils.js +0 -133
- package/dist/main/lib/functions/ProofUtil.d.ts +0 -9
- package/dist/main/lib/functions/ProofUtil.js +0 -76
- package/dist/main/lib/functions/index.d.ts +0 -3
- package/dist/main/lib/functions/index.js +0 -20
- package/dist/main/lib/types/Authorization.types.d.ts +0 -66
- package/dist/main/lib/types/Authorization.types.js +0 -35
- package/dist/main/lib/types/CredentialIssuance.types.d.ts +0 -88
- package/dist/main/lib/types/CredentialIssuance.types.js +0 -8
- package/dist/main/lib/types/Generic.types.d.ts +0 -19
- package/dist/main/lib/types/Generic.types.js +0 -11
- package/dist/main/lib/types/OAuth2ASMetadata.d.ts +0 -37
- package/dist/main/lib/types/OAuth2ASMetadata.js +0 -3
- package/dist/main/lib/types/OID4VCIServerMetadata.d.ts +0 -65
- package/dist/main/lib/types/OID4VCIServerMetadata.js +0 -3
- package/dist/main/lib/types/Oidc4vciErrors.d.ts +0 -3
- package/dist/main/lib/types/Oidc4vciErrors.js +0 -7
- package/dist/main/lib/types/index.d.ts +0 -6
- package/dist/main/lib/types/index.js +0 -23
- package/dist/main/tsconfig.build.tsbuildinfo +0 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { BAD_PARAMS, JWS_NOT_VALID, Jwt, JWTHeader, JWTPayload, ProofOfPossession, ProofOfPossessionCallbacks, Typ } from '@sphereon/oid4vci-common';
|
|
2
|
+
import Debug from 'debug';
|
|
3
|
+
|
|
4
|
+
const debug = Debug('sphereon:openid4vci:token');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* - proofOfPossessionCallback: JWTSignerCallback
|
|
9
|
+
* Mandatory if you want to create (sign) ProofOfPossession
|
|
10
|
+
* - proofOfPossessionVerifierCallback?: JWTVerifyCallback
|
|
11
|
+
* If exists, verifies the ProofOfPossession
|
|
12
|
+
* - proofOfPossessionCallbackArgs: ProofOfPossessionCallbackArgs
|
|
13
|
+
* arguments needed for signing ProofOfPossession
|
|
14
|
+
* @param callbacks:
|
|
15
|
+
* - proofOfPossessionCallback: JWTSignerCallback
|
|
16
|
+
* Mandatory to create (sign) ProofOfPossession
|
|
17
|
+
* - proofOfPossessionVerifierCallback?: JWTVerifyCallback
|
|
18
|
+
* If exists, verifies the ProofOfPossession
|
|
19
|
+
* @param jwtProps
|
|
20
|
+
* @param existingJwt
|
|
21
|
+
* - Optional, clientId of the party requesting the credential
|
|
22
|
+
*/
|
|
23
|
+
export const createProofOfPossession = async (
|
|
24
|
+
callbacks: ProofOfPossessionCallbacks,
|
|
25
|
+
jwtProps?: JwtProps,
|
|
26
|
+
existingJwt?: Jwt
|
|
27
|
+
): Promise<ProofOfPossession> => {
|
|
28
|
+
if (!callbacks.signCallback) {
|
|
29
|
+
debug(`no jwt signer callback or arguments supplied!`);
|
|
30
|
+
throw new Error(BAD_PARAMS);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const signerArgs = createJWT(jwtProps, existingJwt);
|
|
34
|
+
const jwt = await callbacks.signCallback(signerArgs, signerArgs.header.kid);
|
|
35
|
+
const proof = {
|
|
36
|
+
proof_type: 'jwt',
|
|
37
|
+
jwt,
|
|
38
|
+
} as ProofOfPossession;
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
partiallyValidateJWS(jwt);
|
|
42
|
+
if (callbacks.verifyCallback) {
|
|
43
|
+
debug(`Calling supplied verify callback....`);
|
|
44
|
+
await callbacks.verifyCallback({ jwt, kid: signerArgs.header.kid });
|
|
45
|
+
debug(`Supplied verify callback return success result`);
|
|
46
|
+
}
|
|
47
|
+
} catch {
|
|
48
|
+
debug(`JWS was not valid`);
|
|
49
|
+
throw new Error(JWS_NOT_VALID);
|
|
50
|
+
}
|
|
51
|
+
debug(`Proof of Possession JWT:\r\n${jwt}`);
|
|
52
|
+
return proof;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const partiallyValidateJWS = (jws: string): void => {
|
|
56
|
+
if (jws.split('.').length !== 3 || !jws.startsWith('ey')) {
|
|
57
|
+
throw new Error(JWS_NOT_VALID);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export interface JwtProps {
|
|
62
|
+
typ?: Typ;
|
|
63
|
+
kid?: string;
|
|
64
|
+
issuer?: string;
|
|
65
|
+
clientId?: string;
|
|
66
|
+
alg?: string;
|
|
67
|
+
jti?: string;
|
|
68
|
+
nonce?: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const createJWT = (jwtProps?: JwtProps, existingJwt?: Jwt): Jwt => {
|
|
72
|
+
const aud = getJwtProperty('aud', true, jwtProps?.issuer, existingJwt?.payload?.aud);
|
|
73
|
+
const iss = getJwtProperty('iss', false, jwtProps?.clientId, existingJwt?.payload?.iss);
|
|
74
|
+
const jti = getJwtProperty('jti', false, jwtProps?.jti, existingJwt?.payload?.jti);
|
|
75
|
+
const typ = getJwtProperty('typ', true, jwtProps?.typ, existingJwt?.header?.typ, 'jwt');
|
|
76
|
+
const nonce = getJwtProperty('nonce', false, jwtProps?.nonce, existingJwt?.payload?.nonce); // Officially this is required, but some implementations don't have it
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
78
|
+
const alg = getJwtProperty('alg', false, jwtProps?.alg, existingJwt?.header?.alg, 'ES256')!;
|
|
79
|
+
const kid = getJwtProperty('kid', true, jwtProps?.kid, existingJwt?.header?.kid);
|
|
80
|
+
const jwt: Partial<Jwt> = existingJwt ? existingJwt : {};
|
|
81
|
+
const now = +new Date();
|
|
82
|
+
const jwtPayload: Partial<JWTPayload> = {
|
|
83
|
+
aud,
|
|
84
|
+
iat: jwt.payload?.iat ? jwt.payload.iat : now / 1000 - 60, // Let's ensure we subtract 60 seconds for potential time offsets
|
|
85
|
+
exp: jwt.payload?.exp ? jwt.payload.exp : now / 1000 + 10 * 60,
|
|
86
|
+
nonce,
|
|
87
|
+
...(iss ? { iss } : {}),
|
|
88
|
+
...(jti ? { jti } : {}),
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const jwtHeader: JWTHeader = {
|
|
92
|
+
typ,
|
|
93
|
+
alg,
|
|
94
|
+
kid,
|
|
95
|
+
};
|
|
96
|
+
return {
|
|
97
|
+
payload: { ...jwt.payload, ...jwtPayload },
|
|
98
|
+
header: { ...jwt.header, ...jwtHeader },
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const getJwtProperty = (
|
|
103
|
+
propertyName: string,
|
|
104
|
+
required: boolean,
|
|
105
|
+
option?: string,
|
|
106
|
+
jwtProperty?: string,
|
|
107
|
+
defaultValue?: string
|
|
108
|
+
): string | undefined => {
|
|
109
|
+
if (option && jwtProperty && option !== jwtProperty) {
|
|
110
|
+
throw Error(`Cannot have a property '${propertyName}' with value '${option}' and different JWT value '${jwtProperty}' at the same time`);
|
|
111
|
+
}
|
|
112
|
+
let result = jwtProperty ? jwtProperty : option;
|
|
113
|
+
if (!result) {
|
|
114
|
+
if (required) {
|
|
115
|
+
throw Error(`No ${propertyName} property provided either in a JWT or as option`);
|
|
116
|
+
}
|
|
117
|
+
result = defaultValue;
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './
|
|
1
|
+
export * from './AccessTokenClient';
|
|
2
|
+
export * from './CredentialOfferClient';
|
|
3
|
+
export * from './CredentialRequestClient';
|
|
4
|
+
export * from './CredentialRequestClientBuilder';
|
|
5
|
+
export * from './functions';
|
|
6
|
+
export * from './MetadataClient';
|
|
7
|
+
export * from './OpenID4VCIClient';
|
|
8
|
+
export * from './ProofOfPossessionBuilder';
|
package/package.json
CHANGED
|
@@ -1,71 +1,68 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@sphereon/oid4vci-client",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "OpenID for Verifiable Credential Issuance (
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
},
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
"@
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
},
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"OID4VCI"
|
|
70
|
-
]
|
|
71
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@sphereon/oid4vci-client",
|
|
3
|
+
"version": "0.4.1-next.285+47fec82",
|
|
4
|
+
"description": "OpenID for Verifiable Credential Issuance (OpenID4VCI) client",
|
|
5
|
+
"source": "lib/index.ts",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"author": "Sphereon",
|
|
9
|
+
"license": "Apache-2.0",
|
|
10
|
+
"private": false,
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@sphereon/oid4vci-common": "0.4.1-next.285+47fec82",
|
|
19
|
+
"@sphereon/ssi-types": "^0.9.0",
|
|
20
|
+
"cross-fetch": "^3.1.5",
|
|
21
|
+
"debug": "^4.3.4",
|
|
22
|
+
"uint8arrays": "^3.1.1"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/jest": "^29.5.0",
|
|
26
|
+
"@types/node": "^18.15.3",
|
|
27
|
+
"@typescript-eslint/eslint-plugin": "^5.36.1",
|
|
28
|
+
"@typescript-eslint/parser": "^5.36.1",
|
|
29
|
+
"codecov": "^3.8.3",
|
|
30
|
+
"dotenv": "^16.0.2",
|
|
31
|
+
"eslint": "^8.23.0",
|
|
32
|
+
"eslint-config-prettier": "^8.5.0",
|
|
33
|
+
"eslint-plugin-eslint-comments": "^3.2.0",
|
|
34
|
+
"eslint-plugin-import": "^2.26.0",
|
|
35
|
+
"jest": "^29.1.2",
|
|
36
|
+
"jest-junit": "^14.0.1",
|
|
37
|
+
"jose": "^4.10.0",
|
|
38
|
+
"nock": "^13.2.9",
|
|
39
|
+
"npm-run-all": "^4.1.5",
|
|
40
|
+
"open-cli": "^7.0.1",
|
|
41
|
+
"ts-jest": "^29.0.5",
|
|
42
|
+
"ts-node": "^10.9.1",
|
|
43
|
+
"typescript": "4.9.5"
|
|
44
|
+
},
|
|
45
|
+
"engines": {
|
|
46
|
+
"node": ">=16"
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"lib/**/*",
|
|
50
|
+
"dist/**/*"
|
|
51
|
+
],
|
|
52
|
+
"prettier": {
|
|
53
|
+
"singleQuote": true,
|
|
54
|
+
"printWidth": 150
|
|
55
|
+
},
|
|
56
|
+
"keywords": [
|
|
57
|
+
"Sphereon",
|
|
58
|
+
"Verifiable Credentials",
|
|
59
|
+
"OpenID",
|
|
60
|
+
"OpenID for Verifiable Credential Issuance",
|
|
61
|
+
"OAuth2",
|
|
62
|
+
"SSI",
|
|
63
|
+
"OpenID4VCI",
|
|
64
|
+
"OIDC4VCI",
|
|
65
|
+
"OID4VCI"
|
|
66
|
+
],
|
|
67
|
+
"gitHead": "47fec82924b0d4a32f25737d7ba7379903fdb4f0"
|
|
68
|
+
}
|
package/CHANGELOG.md
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
# Release Notes
|
|
2
|
-
|
|
3
|
-
## v0.2.0 - 2022-11-04
|
|
4
|
-
|
|
5
|
-
Release with support for the pre-authorized code flow only.
|
|
6
|
-
|
|
7
|
-
Expect breaking changes in the future, as this package still is undergoing heavy development.
|
|
8
|
-
|
|
9
|
-
- Added:
|
|
10
|
-
- Support for well-known OID4VCI, oAuth2 and OpenID metadata
|
|
11
|
-
|
|
12
|
-
- Fixes:
|
|
13
|
-
- Several fixes related to pincode handling
|
|
14
|
-
- Overall fixes
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
## v0.1.0 - 2022-10-18
|
|
18
|
-
|
|
19
|
-
Initial release with support for the pre-authorized code flow only.
|
|
20
|
-
|
|
21
|
-
Expect breaking changes in the future, as this package still is undergoing heavy development.
|
package/dist/main/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './lib';
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { AccessTokenRequest, AccessTokenRequestOpts, AccessTokenResponse, AuthorizationServerOpts, EndpointMetadata, ErrorResponse, IssuanceInitiationRequestPayload, IssuanceInitiationWithBaseUrl, IssuerOpts } from './types';
|
|
2
|
-
export declare class AccessTokenClient {
|
|
3
|
-
acquireAccessTokenUsingIssuanceInitiation(issuanceInitiation: IssuanceInitiationWithBaseUrl, opts?: AccessTokenRequestOpts): Promise<AccessTokenResponse | ErrorResponse>;
|
|
4
|
-
acquireAccessTokenUsingRequest(accessTokenRequest: AccessTokenRequest, opts?: {
|
|
5
|
-
isPinRequired?: boolean;
|
|
6
|
-
metadata?: EndpointMetadata;
|
|
7
|
-
asOpts?: AuthorizationServerOpts;
|
|
8
|
-
issuerOpts?: IssuerOpts;
|
|
9
|
-
}): Promise<AccessTokenResponse | ErrorResponse>;
|
|
10
|
-
createAccessTokenRequest(issuanceInitiationRequest: IssuanceInitiationRequestPayload, opts?: AccessTokenRequestOpts): Promise<AccessTokenRequest>;
|
|
11
|
-
private assertPreAuthorizedGrantType;
|
|
12
|
-
private isPinRequiredValue;
|
|
13
|
-
private assertNumericPin;
|
|
14
|
-
private assertNonEmptyPreAuthorizedCode;
|
|
15
|
-
private validate;
|
|
16
|
-
private sendAuthCode;
|
|
17
|
-
private determineTokenURL;
|
|
18
|
-
private creatTokenURLFromURL;
|
|
19
|
-
private throwNotSupportedFlow;
|
|
20
|
-
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.AccessTokenClient = void 0;
|
|
13
|
-
const ssi_types_1 = require("@sphereon/ssi-types");
|
|
14
|
-
const MetadataClient_1 = require("./MetadataClient");
|
|
15
|
-
const functions_1 = require("./functions");
|
|
16
|
-
const types_1 = require("./types");
|
|
17
|
-
class AccessTokenClient {
|
|
18
|
-
acquireAccessTokenUsingIssuanceInitiation(issuanceInitiation, opts) {
|
|
19
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
-
const { issuanceInitiationRequest } = issuanceInitiation;
|
|
21
|
-
const isPinRequired = this.isPinRequiredValue(issuanceInitiationRequest);
|
|
22
|
-
const reqOpts = {
|
|
23
|
-
isPinRequired,
|
|
24
|
-
issuerOpts: { issuer: issuanceInitiationRequest.issuer },
|
|
25
|
-
asOpts: (opts === null || opts === void 0 ? void 0 : opts.asOpts) ? Object.assign({}, opts.asOpts) : undefined,
|
|
26
|
-
metadata: opts === null || opts === void 0 ? void 0 : opts.metadata,
|
|
27
|
-
};
|
|
28
|
-
return yield this.acquireAccessTokenUsingRequest(yield this.createAccessTokenRequest(issuanceInitiationRequest, opts), reqOpts);
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
acquireAccessTokenUsingRequest(accessTokenRequest, opts) {
|
|
32
|
-
var _a;
|
|
33
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
-
this.validate(accessTokenRequest, opts === null || opts === void 0 ? void 0 : opts.isPinRequired);
|
|
35
|
-
const requestTokenURL = this.determineTokenURL(opts === null || opts === void 0 ? void 0 : opts.asOpts, opts === null || opts === void 0 ? void 0 : opts.issuerOpts, (opts === null || opts === void 0 ? void 0 : opts.metadata)
|
|
36
|
-
? opts === null || opts === void 0 ? void 0 : opts.metadata
|
|
37
|
-
: ((_a = opts === null || opts === void 0 ? void 0 : opts.issuerOpts) === null || _a === void 0 ? void 0 : _a.fetchMetadata)
|
|
38
|
-
? yield MetadataClient_1.MetadataClient.retrieveAllMetadata(opts === null || opts === void 0 ? void 0 : opts.issuerOpts.issuer, { errorOnNotFound: false })
|
|
39
|
-
: undefined);
|
|
40
|
-
return this.sendAuthCode(requestTokenURL, accessTokenRequest);
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
createAccessTokenRequest(issuanceInitiationRequest, opts) {
|
|
44
|
-
var _a;
|
|
45
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
-
const request = {};
|
|
47
|
-
if ((_a = opts === null || opts === void 0 ? void 0 : opts.asOpts) === null || _a === void 0 ? void 0 : _a.clientId) {
|
|
48
|
-
request.client_id = opts.asOpts.clientId;
|
|
49
|
-
}
|
|
50
|
-
if (this.isPinRequiredValue(issuanceInitiationRequest)) {
|
|
51
|
-
this.assertNumericPin(true, opts.pin);
|
|
52
|
-
request.user_pin = opts.pin;
|
|
53
|
-
}
|
|
54
|
-
if (issuanceInitiationRequest[types_1.PRE_AUTH_CODE_LITERAL]) {
|
|
55
|
-
request.grant_type = types_1.GrantTypes.PRE_AUTHORIZED_CODE;
|
|
56
|
-
request[types_1.PRE_AUTH_CODE_LITERAL] = issuanceInitiationRequest[types_1.PRE_AUTH_CODE_LITERAL];
|
|
57
|
-
}
|
|
58
|
-
if (issuanceInitiationRequest.op_state) {
|
|
59
|
-
if (issuanceInitiationRequest[types_1.PRE_AUTH_CODE_LITERAL]) {
|
|
60
|
-
throw new Error('Cannot have both a pre_authorized_code and a op_state in the same initiation request');
|
|
61
|
-
}
|
|
62
|
-
request.grant_type = types_1.GrantTypes.AUTHORIZATION_CODE;
|
|
63
|
-
this.throwNotSupportedFlow();
|
|
64
|
-
}
|
|
65
|
-
return request;
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
assertPreAuthorizedGrantType(grantType) {
|
|
69
|
-
if (types_1.GrantTypes.PRE_AUTHORIZED_CODE !== grantType) {
|
|
70
|
-
throw new Error("grant type must be 'urn:ietf:params:oauth:grant-type:pre-authorized_code'");
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
isPinRequiredValue(issuanceInitiationRequest) {
|
|
74
|
-
let isPinRequired = false;
|
|
75
|
-
if (issuanceInitiationRequest !== undefined) {
|
|
76
|
-
if (typeof issuanceInitiationRequest.user_pin_required === 'string') {
|
|
77
|
-
isPinRequired = issuanceInitiationRequest.user_pin_required.toLowerCase() === 'true';
|
|
78
|
-
}
|
|
79
|
-
else if (typeof issuanceInitiationRequest.user_pin_required === 'boolean') {
|
|
80
|
-
isPinRequired = issuanceInitiationRequest.user_pin_required;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return isPinRequired;
|
|
84
|
-
}
|
|
85
|
-
assertNumericPin(isPinRequired, pin) {
|
|
86
|
-
if (isPinRequired) {
|
|
87
|
-
if (!pin || !/^\d{1,8}$/.test(pin)) {
|
|
88
|
-
throw new Error('A valid pin consisting of maximal 8 numeric characters must be present.');
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else if (pin) {
|
|
92
|
-
throw new Error('Cannot set a pin, when the pin is not required.');
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
assertNonEmptyPreAuthorizedCode(accessTokenRequest) {
|
|
96
|
-
if (!accessTokenRequest[types_1.PRE_AUTH_CODE_LITERAL]) {
|
|
97
|
-
throw new Error('Pre-authorization must be proven by presenting the pre-authorized code. Code must be present.');
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
validate(accessTokenRequest, isPinRequired) {
|
|
101
|
-
if (accessTokenRequest.grant_type === types_1.GrantTypes.PRE_AUTHORIZED_CODE) {
|
|
102
|
-
this.assertPreAuthorizedGrantType(accessTokenRequest.grant_type);
|
|
103
|
-
this.assertNonEmptyPreAuthorizedCode(accessTokenRequest);
|
|
104
|
-
this.assertNumericPin(isPinRequired, accessTokenRequest.user_pin);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.throwNotSupportedFlow();
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
sendAuthCode(requestTokenURL, accessTokenRequest) {
|
|
111
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
-
const response = yield (0, functions_1.formPost)(requestTokenURL, (0, functions_1.convertJsonToURI)(accessTokenRequest));
|
|
113
|
-
return yield response.json();
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
determineTokenURL(asOpts, issuerOpts, metadata) {
|
|
117
|
-
if (!asOpts && !issuerOpts) {
|
|
118
|
-
throw new Error('Cannot determine token URL if no issuer and no Authorization Server values are present');
|
|
119
|
-
}
|
|
120
|
-
const url = asOpts && asOpts.as
|
|
121
|
-
? this.creatTokenURLFromURL(asOpts.as, asOpts.tokenEndpoint)
|
|
122
|
-
: (metadata === null || metadata === void 0 ? void 0 : metadata.token_endpoint)
|
|
123
|
-
? metadata.token_endpoint
|
|
124
|
-
: this.creatTokenURLFromURL(issuerOpts.issuer, issuerOpts.tokenEndpoint);
|
|
125
|
-
if (!url || !ssi_types_1.ObjectUtils.isString(url)) {
|
|
126
|
-
throw new Error('No authorization server token URL present. Cannot acquire access token');
|
|
127
|
-
}
|
|
128
|
-
return url;
|
|
129
|
-
}
|
|
130
|
-
creatTokenURLFromURL(url, tokenEndpoint) {
|
|
131
|
-
const hostname = url.replace(/https?:\/\//, '').replace(/\/$/, '');
|
|
132
|
-
const endpoint = tokenEndpoint ? (tokenEndpoint.startsWith('/') ? tokenEndpoint : tokenEndpoint.substring(1)) : '/token';
|
|
133
|
-
// We always require https
|
|
134
|
-
return `https://${hostname}${endpoint}`;
|
|
135
|
-
}
|
|
136
|
-
throwNotSupportedFlow() {
|
|
137
|
-
throw new Error('Only pre-authorized-code flow is supported');
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
exports.AccessTokenClient = AccessTokenClient;
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNjZXNzVG9rZW5DbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvQWNjZXNzVG9rZW5DbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsbURBQWtEO0FBRWxELHFEQUFrRDtBQUNsRCwyQ0FBeUQ7QUFDekQsbUNBWWlCO0FBRWpCLE1BQWEsaUJBQWlCO0lBQ2YseUNBQXlDLENBQ3BELGtCQUFpRCxFQUNqRCxJQUE2Qjs7WUFFN0IsTUFBTSxFQUFFLHlCQUF5QixFQUFFLEdBQUcsa0JBQWtCLENBQUM7WUFFekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDekUsTUFBTSxPQUFPLEdBQUc7Z0JBQ2QsYUFBYTtnQkFDYixVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUseUJBQXlCLENBQUMsTUFBTSxFQUFFO2dCQUN4RCxNQUFNLEVBQUUsQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsTUFBTSxFQUFDLENBQUMsbUJBQU0sSUFBSSxDQUFDLE1BQU0sRUFBRyxDQUFDLENBQUMsU0FBUztnQkFDckQsUUFBUSxFQUFFLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxRQUFRO2FBQ3pCLENBQUM7WUFDRixPQUFPLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xJLENBQUM7S0FBQTtJQUVZLDhCQUE4QixDQUN6QyxrQkFBc0MsRUFDdEMsSUFBMEg7OztZQUUxSCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxhQUFhLENBQUMsQ0FBQztZQUN2RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQzVD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
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { CredentialFormat } from '@sphereon/ssi-types';
|
|
2
|
-
import { CredentialRequestClientBuilder } from './CredentialRequestClientBuilder';
|
|
3
|
-
import { CredentialRequest, CredentialResponse, ErrorResponse, ProofOfPossession, ProofOfPossessionOpts } from './types';
|
|
4
|
-
export declare class CredentialRequestClient {
|
|
5
|
-
_issuanceRequestOpts: Partial<{
|
|
6
|
-
credentialEndpoint: string;
|
|
7
|
-
clientId: string;
|
|
8
|
-
credentialType: string | string[];
|
|
9
|
-
format: CredentialFormat | CredentialFormat[];
|
|
10
|
-
proof: ProofOfPossession;
|
|
11
|
-
token: string;
|
|
12
|
-
}>;
|
|
13
|
-
getCredentialEndpoint(): string;
|
|
14
|
-
getClientId(): string;
|
|
15
|
-
constructor(builder: CredentialRequestClientBuilder);
|
|
16
|
-
static builder(): CredentialRequestClientBuilder;
|
|
17
|
-
acquireCredentialsUsingProof(proof: ProofOfPossession | ProofOfPossessionOpts, opts?: {
|
|
18
|
-
credentialType?: string | string[];
|
|
19
|
-
format?: CredentialFormat | CredentialFormat[];
|
|
20
|
-
overrideIssuerURL?: string;
|
|
21
|
-
overrideAccessToken?: string;
|
|
22
|
-
}): Promise<CredentialResponse | ErrorResponse>;
|
|
23
|
-
acquireCredentialsUsingRequest(request: CredentialRequest, opts?: {
|
|
24
|
-
overrideCredentialEndpoint?: string;
|
|
25
|
-
overrideAccessToken?: string;
|
|
26
|
-
}): Promise<CredentialResponse | ErrorResponse>;
|
|
27
|
-
createCredentialRequest(proof: ProofOfPossession | ProofOfPossessionOpts, opts?: {
|
|
28
|
-
credentialType?: string | string[];
|
|
29
|
-
format?: CredentialFormat | CredentialFormat[];
|
|
30
|
-
}): Promise<CredentialRequest>;
|
|
31
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.CredentialRequestClient = void 0;
|
|
13
|
-
const CredentialRequestClientBuilder_1 = require("./CredentialRequestClientBuilder");
|
|
14
|
-
const functions_1 = require("./functions");
|
|
15
|
-
const types_1 = require("./types");
|
|
16
|
-
class CredentialRequestClient {
|
|
17
|
-
constructor(builder) {
|
|
18
|
-
this._issuanceRequestOpts = Object.assign({}, builder);
|
|
19
|
-
}
|
|
20
|
-
getCredentialEndpoint() {
|
|
21
|
-
return this._issuanceRequestOpts.credentialEndpoint;
|
|
22
|
-
}
|
|
23
|
-
getClientId() {
|
|
24
|
-
return this._issuanceRequestOpts.clientId;
|
|
25
|
-
}
|
|
26
|
-
static builder() {
|
|
27
|
-
return new CredentialRequestClientBuilder_1.CredentialRequestClientBuilder();
|
|
28
|
-
}
|
|
29
|
-
acquireCredentialsUsingProof(proof, opts) {
|
|
30
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
const request = yield this.createCredentialRequest(proof, Object.assign({}, opts));
|
|
32
|
-
return yield this.acquireCredentialsUsingRequest(request, Object.assign({}, opts));
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
acquireCredentialsUsingRequest(request, opts) {
|
|
36
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
-
const credentialEndpoint = (opts === null || opts === void 0 ? void 0 : opts.overrideCredentialEndpoint)
|
|
38
|
-
? opts.overrideCredentialEndpoint
|
|
39
|
-
: this._issuanceRequestOpts.credentialEndpoint;
|
|
40
|
-
if (!(0, functions_1.isValidURL)(credentialEndpoint)) {
|
|
41
|
-
throw new Error(types_1.URL_NOT_VALID);
|
|
42
|
-
}
|
|
43
|
-
const requestToken = (opts === null || opts === void 0 ? void 0 : opts.overrideAccessToken) ? opts.overrideAccessToken : this._issuanceRequestOpts.token;
|
|
44
|
-
const response = yield (0, functions_1.post)(credentialEndpoint, JSON.stringify(request), { bearerToken: requestToken });
|
|
45
|
-
const responseJson = yield response.json();
|
|
46
|
-
if (responseJson.error) {
|
|
47
|
-
return Object.assign({}, responseJson);
|
|
48
|
-
}
|
|
49
|
-
return Object.assign({}, responseJson);
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
createCredentialRequest(proof, opts) {
|
|
53
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
54
|
-
const proofOfPossession = 'jwt' in proof
|
|
55
|
-
? proof
|
|
56
|
-
: yield (0, functions_1.createProofOfPossession)(Object.assign({ issuerURL: proof.issuerURL ? proof.issuerURL : this._issuanceRequestOpts.credentialEndpoint, clientId: proof.clientId ? proof.clientId : this._issuanceRequestOpts.clientId }, proof));
|
|
57
|
-
return {
|
|
58
|
-
type: (opts === null || opts === void 0 ? void 0 : opts.credentialType) ? opts.credentialType : this._issuanceRequestOpts.credentialType,
|
|
59
|
-
format: (opts === null || opts === void 0 ? void 0 : opts.format) ? opts.format : this._issuanceRequestOpts.format,
|
|
60
|
-
proof: proofOfPossession,
|
|
61
|
-
};
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
exports.CredentialRequestClient = CredentialRequestClient;
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JlZGVudGlhbFJlcXVlc3RDbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvQ3JlZGVudGlhbFJlcXVlc3RDbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRUEscUZBQWtGO0FBQ2xGLDJDQUF3RTtBQUN4RSxtQ0FBd0k7QUFFeEksTUFBYSx1QkFBdUI7SUFrQmxDLFlBQW1CLE9BQXVDO1FBQ3hELElBQUksQ0FBQyxvQkFBb0IscUJBQVEsT0FBTyxDQUFFLENBQUM7SUFDN0MsQ0FBQztJQVZNLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQztJQUN0RCxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQU1NLE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU8sSUFBSSwrREFBOEIsRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFWSw0QkFBNEIsQ0FDdkMsS0FBZ0QsRUFDaEQsSUFLQzs7WUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLG9CQUFPLElBQUksRUFBRyxDQUFDO1lBQ3ZFLE9BQU8sTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUMsT0FBTyxvQkFBTyxJQUFJLEVBQUcsQ0FBQztRQUN6RSxDQUFDO0tBQUE7SUFFWSw4QkFBOEIsQ0FDekMsT0FBMEIsRUFDMUIsSUFBNEU7O1lBRTVFLE1BQU0sa0JBQWtCLEdBQVcsQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsMEJBQTBCO2dCQUNqRSxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQjtnQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxrQkFBa0IsQ0FBQztZQUNqRCxJQUFJLENBQUMsSUFBQSxzQkFBVSxFQUFDLGtCQUFrQixDQUFDLEVBQUU7Z0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQWEsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0QsTUFBTSxZQUFZLEdBQVcsQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsbUJBQW1CLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQztZQUNwSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsZ0JBQUksRUFBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDeEcsTUFBTSxZQUFZLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFO2dCQUN0QixPQUFPLGtCQUFLLFlBQVksQ0FBbUIsQ0FBQzthQUM3QztZQUNELE9BQU8sa0JBQUssWUFBWSxDQUF3QixDQUFDO1FBQ25ELENBQUM7S0FBQTtJQUVZLHVCQUF1QixDQUNsQyxLQUFnRCxFQUNoRCxJQUdDOztZQUVELE1BQU0saUJBQWlCLEdBQ3JCLEtBQUssSUFBSSxLQUFLO2dCQUNaLENBQUMsQ0FBQyxLQUFLO2dCQUNQLENBQUMsQ0FBQyxNQUFNLElBQUEsbUNBQXVCLGtCQUMzQixTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGtCQUFrQixFQUMzRixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsSUFDM0UsS0FBSyxFQUNSLENBQUM7WUFDVCxPQUFPO2dCQUNMLElBQUksRUFBRSxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxjQUFjLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjO2dCQUMzRixNQUFNLEVBQUUsQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTTtnQkFDckUsS0FBSyxFQUFFLGlCQUFpQjthQUN6QixDQUFDO1FBQ0osQ0FBQztLQUFBO0NBQ0Y7QUEvRUQsMERBK0VDIn0=
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { CredentialFormat } from '@sphereon/ssi-types';
|
|
2
|
-
import { CredentialRequestClient } from './CredentialRequestClient';
|
|
3
|
-
import { AccessTokenResponse, EndpointMetadata, IssuanceInitiationRequestPayload, IssuanceInitiationWithBaseUrl, OID4VCIServerMetadata } from './types';
|
|
4
|
-
export declare class CredentialRequestClientBuilder {
|
|
5
|
-
credentialEndpoint: string;
|
|
6
|
-
clientId: string;
|
|
7
|
-
credentialType: string | string[];
|
|
8
|
-
format: CredentialFormat | CredentialFormat[];
|
|
9
|
-
token: string;
|
|
10
|
-
static fromIssuanceInitiationURI(issuanceInitiationURI: string, metadata?: EndpointMetadata): CredentialRequestClientBuilder;
|
|
11
|
-
static fromIssuanceInitiationRequest(issuanceInitiationRequest: IssuanceInitiationRequestPayload, metadata?: EndpointMetadata): CredentialRequestClientBuilder;
|
|
12
|
-
static fromIssuanceInitiation(issuanceInitiation: IssuanceInitiationWithBaseUrl, metadata?: EndpointMetadata): CredentialRequestClientBuilder;
|
|
13
|
-
withCredentialEndpointFromMetadata(metadata: OID4VCIServerMetadata): CredentialRequestClientBuilder;
|
|
14
|
-
withCredentialEndpoint(credentialEndpoint: string): CredentialRequestClientBuilder;
|
|
15
|
-
withCredentialType(credentialType: string | string[]): CredentialRequestClientBuilder;
|
|
16
|
-
withFormat(format: CredentialFormat | CredentialFormat[]): CredentialRequestClientBuilder;
|
|
17
|
-
withClientId(clientId: string): CredentialRequestClientBuilder;
|
|
18
|
-
withToken(accessToken: string): CredentialRequestClientBuilder;
|
|
19
|
-
withTokenFromResponse(response: AccessTokenResponse): CredentialRequestClientBuilder;
|
|
20
|
-
build(): CredentialRequestClient;
|
|
21
|
-
}
|