diff --git a/utils/JS/JWT/example.js b/utils/JS/JWT/example.js new file mode 100644 index 00000000..99373359 --- /dev/null +++ b/utils/JS/JWT/example.js @@ -0,0 +1,83 @@ +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); + } +});