forked from lthn/blockchain
84 lines
2.3 KiB
JavaScript
84 lines
2.3 KiB
JavaScript
|
|
const axios = require('axios');
|
||
|
|
const forge = require('node-forge');
|
||
|
|
|
||
|
|
// Your shared JWT secret (must match what the server expects)
|
||
|
|
const JWT_SECRET = 'hiwejkcddkndspo230XASIijksk123i9x5';
|
||
|
|
|
||
|
|
|
||
|
|
const apiCredentials = {token: JWT_SECRET};
|
||
|
|
|
||
|
|
function createJWSToken(payload, secrete_str) {
|
||
|
|
const header = { alg: 'HS256', typ: 'JWT' };
|
||
|
|
const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64').replace(/=/g, '');
|
||
|
|
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64').replace(/=/g, '');
|
||
|
|
|
||
|
|
const signature = forge.hmac.create();
|
||
|
|
signature.start('sha256', secrete_str);
|
||
|
|
signature.update(`${encodedHeader}.${encodedPayload}`);
|
||
|
|
const encodedSignature = forge.util.encode64(signature.digest().getBytes()).replace(/=/g, '');
|
||
|
|
|
||
|
|
return `${encodedHeader}.${encodedPayload}.${encodedSignature}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
function generateRandomString(length) {
|
||
|
|
const bytes = forge.random.getBytesSync(Math.ceil(length / 2));
|
||
|
|
const hexString = forge.util.bytesToHex(bytes);
|
||
|
|
return hexString.substring(0, length);
|
||
|
|
}
|
||
|
|
|
||
|
|
function generateAccessToken(httpBody) {
|
||
|
|
|
||
|
|
if (!apiCredentials?.token) {
|
||
|
|
throw new Error("No API credentials found, extension is not connected");
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
const md = forge.md.sha256.create();
|
||
|
|
md.update(httpBody);
|
||
|
|
const bodyHash = md.digest().toHex();
|
||
|
|
|
||
|
|
// Example payload
|
||
|
|
const payload = {
|
||
|
|
body_hash: bodyHash,
|
||
|
|
user: 'zano_extension',
|
||
|
|
salt: generateRandomString(64),
|
||
|
|
exp: Math.floor(Date.now() / 1000) + (60), // Expires in 1 minute
|
||
|
|
};
|
||
|
|
|
||
|
|
return createJWSToken(payload, apiCredentials?.token);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
// JSON-RPC 2.0 request body
|
||
|
|
const requestData = {
|
||
|
|
jsonrpc: '2.0',
|
||
|
|
id: 0,
|
||
|
|
method: 'getbalance',
|
||
|
|
params: {},
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
const http_body = JSON.stringify(requestData);
|
||
|
|
|
||
|
|
// Create JWT token
|
||
|
|
const token = generateAccessToken(http_body);
|
||
|
|
|
||
|
|
|
||
|
|
// Send POST request
|
||
|
|
axios.post('http://127.0.0.1:11111/json_rpc', requestData, {
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json',
|
||
|
|
'Zano-Access-Token': `${token}`,
|
||
|
|
},
|
||
|
|
})
|
||
|
|
.then(response => {
|
||
|
|
console.log('Response:', response.data);
|
||
|
|
})
|
||
|
|
.catch(error => {
|
||
|
|
if (error.response) {
|
||
|
|
console.error('Error Response:', error.response.status, error.response.data);
|
||
|
|
} else {
|
||
|
|
console.error('Request Error:', error.message);
|
||
|
|
}
|
||
|
|
});
|