-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
116 lines (102 loc) · 4.19 KB
/
index.js
1
2
3
4
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
const axios = require("axios").default;
const dotenv = require("dotenv");
const fs = require("fs/promises");
const jwt = require("jsonwebtoken");
const uuid = require("uuid");
dotenv.config();
const issuanceDate = new Date();
const issuanceTime = Math.floor(issuanceDate.getTime() / 1000);
const expirationDate = new Date((issuanceTime + 30) * 1000);
const expirationTime = Math.floor(expirationDate.getTime() / 1000);
async function getVerifiableCredential() {
return JSON.parse(await fs.readFile("verifiable-credential.json", "utf8"));
}
function createVerifiablePresentationJwtPayload(verifiableCredential) {
return {
iss: verifiableCredential.issuer,
sub: verifiableCredential.issuer,
iat: issuanceTime,
nbf: issuanceTime,
exp: expirationTime,
nonce: uuid.v4(),
jti: uuid.v4(),
vp: {
"@context": ["https://www.w3.org/2018/credentials/v1"],
id: "urn:uuid:" + uuid.v4(),
type: ["VerifiablePresentation"],
holder: verifiableCredential.issuer,
verifiableCredential: [verifiableCredential]
}
};
}
function createVerifiablePresentationJwt(verifiablePresentationJwtPayload, privateKey) {
const options = {
algorithm: "RS256",
header: {
typ: "JWT",
alg: "RS256",
kid: verifiablePresentationJwtPayload.iss
}
};
return jwt.sign(verifiablePresentationJwtPayload, privateKey, options);
}
function createVerifiablePresentation(verifiablePresentationJwtPayload, verifiablePresentationJwt, verifiableCredential) {
return {
"sub": verifiablePresentationJwtPayload.sub,
"iat": verifiablePresentationJwtPayload.iat,
"nonce": verifiablePresentationJwtPayload.nonce,
"vp": {
"id": verifiablePresentationJwtPayload.vp.id,
"holder": verifiablePresentationJwtPayload.vp.holder
},
"verifiableCredential": [verifiableCredential],
"holder": verifiablePresentationJwtPayload.iss,
"id": verifiablePresentationJwtPayload.jti,
"type": ["VerifiablePresentation"],
"@context": ["https://www.w3.org/2018/credentials/v1"],
"issuanceDate": issuanceDate.toISOString(),
"expirationDate": expirationDate.toISOString(),
"proof": {
"type": "JwtProof2020",
"jwt": verifiablePresentationJwt
}
};
}
async function requestAccessToken(vcVerifierTokenUrl, verifiablePresentation) {
const params = new URLSearchParams();
params.append("grant_type", "vp_token");
params.append("vp_token", btoa(JSON.stringify(verifiablePresentation)).replace(/={1,2}$/, ""));
params.append("presentation_submission", "");
params.append("scope", "");
const config = {
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
};
const response = await axios.post(vcVerifierTokenUrl, params, config);
return response.data.access_token;
}
async function requestStreetlights(contextBrokerUrl, accessToken) {
const config = {
headers: {
Authorization: `Bearer ${accessToken}`,
Link: `<${process.env.CONTEXT_URL}>; rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json"`
}
};
const response = await axios.get(`${contextBrokerUrl}/ngsi-ld/v1/entities?type=Streetlight`, config);
return response.data;
}
async function main() {
try {
const verifiableCredential = await getVerifiableCredential();
const verifiablePresentationJwtPayload = createVerifiablePresentationJwtPayload(verifiableCredential);
const verifiablePresentationJwt = createVerifiablePresentationJwt(verifiablePresentationJwtPayload, process.env.PRIVATE_KEY);
const verifiablePresentation = createVerifiablePresentation(verifiablePresentationJwtPayload, verifiablePresentationJwt, verifiableCredential);
const accessToken = await requestAccessToken(process.env.VC_VERIFIER_TOKEN_URL, verifiablePresentation);
const streetlights = await requestStreetlights(process.env.CONTEXT_BROKER_URL, accessToken);
console.log(streetlights);
} catch(error) {
console.error(error);
}
}
main();