11const crypto = require ( 'crypto' )
2- const { DateTime } = require ( 'luxon' )
32const { parse : parseUrl } = require ( 'url' )
43
5- module . exports . requestHooks = [
6- async context => {
7- console . log ( context )
8- const { store, request } = context
9- const keyId = await store . getItem ( 'keyId' )
10- let privateKey = await store . getItem ( 'privateKey' )
11- privateKey = `-----BEGIN PRIVATE KEY-----\n${ privateKey } \n-----END PRIVATE KEY-----`
12- const signRequest = await store . getItem ( 'signRequest' )
13-
14- if ( signRequest ) {
15- const parsedUrl = parseUrl ( request . getUrl ( ) )
16-
17- const algorithmBits = 256
18- const hashAlgorithm = `sha${ algorithmBits } `
19- const digestAlgorithm = `SHA-${ algorithmBits } `
20- const signAlgorithm = `RSA-SHA${ algorithmBits } `
21-
22- const date = DateTime . utc ( ) . toRFC2822 ( )
23-
24- const digestHash = crypto . createHash ( hashAlgorithm )
25- const digest = digestHash . update ( request . getBodyText ( ) ) . digest ( 'base64' )
26-
27- const signatureString = [ ]
28- signatureString . push ( `(request-target): ${ request . getMethod ( ) . toLowerCase ( ) } ${ parsedUrl . path } ` )
29- signatureString . push ( `host: ${ parsedUrl . hostname } ` )
30- signatureString . push ( `digest: ${ digestAlgorithm } =${ digest } ` )
31- signatureString . push ( `date: ${ date } ` )
32- if ( request . hasHeader ( 'Content-Type' ) ) signatureString . push ( `content-type: ${ request . getHeader ( 'Content-Type' ) } ` )
33- const signature = signatureString . join ( '\n' )
34-
35- const signatureSign = crypto . createSign ( signAlgorithm )
36- const signedSignature = signatureSign . update ( signature ) . sign ( privateKey , 'base64' )
37-
38- const authorization = `Signature keyId="${ keyId } ", algorithm="${ signAlgorithm . toLowerCase ( ) } ", headers="(request-target) host digest date${ request . hasHeader ( 'Content-Type' ) ? ' content-type' : '' } ", signature="${ signedSignature } "`
39-
40- request . setHeader ( 'Digest' , `${ digestAlgorithm } =${ digest } ` )
41- request . setHeader ( 'Date' , date )
42- request . setHeader ( 'Authorization' , authorization )
43- }
44-
45- await store . clear ( )
46- }
47- ]
48-
494module . exports . templateTags = [ {
505 name : 'httpsignature' ,
516 displayName : 'HTTP Signature' ,
@@ -62,12 +17,28 @@ module.exports.templateTags = [{
6217 }
6318 ] ,
6419
65- async run ( context , keyId , privateKey ) {
66- const { store } = context
67- await store . clear ( )
68- await store . setItem ( 'keyId' , keyId )
69- await store . setItem ( 'privateKey' , privateKey )
70- await store . setItem ( 'signRequest' , true )
71- return ' '
20+ async run ( context , keyId , privateKey ) {
21+ console . log ( context )
22+ const request = await context . util . models . request . getById ( context . meta . requestId )
23+ const requestUrl = await context . util . render ( request . url )
24+
25+ if ( ! keyId ) throw new Error ( 'missing keyId' )
26+ if ( ! privateKey ) throw new Error ( 'missing privateKey' )
27+
28+ const parsedUrl = parseUrl ( requestUrl )
29+
30+ const algorithmBits = 256
31+ const signAlgorithm = `RSA-SHA${ algorithmBits } `
32+
33+ const signatureString = [ ]
34+ signatureString . push ( `(request-target): ${ request . method . toLowerCase ( ) } ${ parsedUrl . path } ` )
35+ signatureString . push ( `host: ${ parsedUrl . hostname } ` )
36+ const signature = signatureString . join ( '\n' )
37+
38+ const signatureSign = crypto . createSign ( signAlgorithm )
39+ const signedSignature = signatureSign . update ( signature ) . sign ( `-----BEGIN RSA PRIVATE KEY-----\n${ privateKey } \n-----END RSA PRIVATE KEY-----` , 'base64' )
40+
41+ const authorization = `keyId="${ keyId } ", algorithm="${ signAlgorithm . toLowerCase ( ) } ", headers="(request-target) host", signature="${ signedSignature } "`
42+ return authorization
7243 }
7344} ]
0 commit comments