Skip to content

Instantly share code, notes, and snippets.

@ritterzk
Last active August 10, 2020 10:01
Show Gist options
  • Save ritterzk/802f1facb524fdd5ca89436d97030936 to your computer and use it in GitHub Desktop.
Save ritterzk/802f1facb524fdd5ca89436d97030936 to your computer and use it in GitHub Desktop.
HRWorks API nodejs js javascript
/*
Example
https://www.hrworks.de/produkt/api/
https://www.hrworks.de/public/HRworks_API_Reference.pdf?x34841
*/
const https = require('https')
const crypto = require('crypto');
const accessKey = "";
const secret = "";
const data = JSON.stringify({
});
const timestamp = new Date();
let hrworksDate = timestamp.toISOString().slice(0, 19) + 'Z';
hrworksDate = hrworksDate.replace(/-/g, '').replace(/:/g, '');
const apiHost = 'api.hrworks.de';
const options = {
hostname: apiHost,
port: 443,
path: '/',
method: 'POST',
headers: {
'Host': apiHost,
'x-hrworks-date': hrworksDate,
'date': timestamp.toUTCString(),
'Authorization': 'HRWORKS-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<SignedHeaders>, Signature=<Signature>',
'Content-Type': 'application/json',
//'Connection': 'Keep-Alive',
'x-hrworks-target': "GetAllOrganizationUnits"
}
}
//step 1
const headerString =
`${options.method}
${options.path}
content-type:${options.headers["Content-Type"]}
host:${options.headers.Host}
x-hrworks-date:${options.headers["x-hrworks-date"]}
x-hrworks-target:${options.headers["x-hrworks-target"]}
`
const payloadHash = crypto.createHash('sha256').update(data).digest('hex');
const canonicalRequest = headerString + payloadHash;
const canonicalRequestHash = crypto.createHash('sha256').update(canonicalRequest).digest('hex');
console.log(canonicalRequest)
//step 2
const stringToSign =
`HRWORKS-HMAC-SHA256
${hrworksDate}
${canonicalRequestHash}`;
//step 3
const realm = "production"; //realm: demo || production
const signA = crypto.createHmac("sha256", "HRWORKS" + secret).update(hrworksDate.substring(0, 8)).digest(); //requestDateValue
const signB = crypto.createHmac("sha256", signA).update(realm).digest(); //realmIdentifier
const signC = crypto.createHmac("sha256", signB).update("hrworks_api_request").digest(); //closingString
const signature = crypto.createHmac("sha256", signC).update(stringToSign).digest('hex'); //stringToSign
//step4
const authorizationHeader = "HRWORKS-HMAC-SHA256" +
` Credential=${encodeURIComponent(accessKey)}/${realm},` +
` SignedHeaders=content-type;host;x-hrworks-date;x-hrworks-target,` +
` Signature=${signature}`;
options.headers.Authorization = authorizationHeader;
console.log(options.headers.Authorization)
const req = https.request(options, (res) => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', (d) => {
process.stdout.write(d)
})
})
req.on('error', (error) => {
console.error(error)
})
req.write(data)
req.end()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment