1
0
Fork 0
forked from lthn/blockchain
blockchain/utils/JS/JWT/example.js
2025-07-04 19:42:08 +04:00

83 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);
}
});