- I am writing.
AccountName = Administrator
Password = administrator
- This is a sample file for learning.
- A file for custom functions to include in your custom app.
aws_v4_sign_envJson ( _accessKeyId ; _secretAccessKey ; _region ; _service ; _method ; _host ; _canonicalURI ; _canonicalQueryString ; _hashedPayload ; _optionJsonObject )
--------------------------------------------------
Let ( [
~timestamp = GetAsTimestamp ( Int ( Get ( CurrentTimeUTCMilliseconds ) / 1000 ) ) ;
~date = GetAsDate ( ~timestamp ) ;
~dateY = Year ( ~date ) ;
~dateM = Right ( "0" & Month ( ~date ) ; 2 ) ;
~dateD = Right ( "0" & Day ( ~date ) ; 2 ) ;
~time = GetAsTime ( ~timestamp ) ;
~timeH = Right ( "0" & Hour ( ~time ) ; 2 ) ;
~timeM = Right ( "0" & Minute ( ~time ) ; 2 ) ;
~timeS = Right ( "0" & Seconds ( ~time ) ; 2 ) ;
~timestampFormat = ~dateY & ~dateM & ~dateD & "T" & ~timeH & ~timeM & ~timeS & "Z" ;
~dateFormat = ~dateY & ~dateM & ~dateD ;
~envJson =
JSONSetElement ( _optionJsonObject ;
[ "accessKeyId" ; _accessKeyId ; JSONString ] ;
[ "secretAccessKey" ; _secretAccessKey ; JSONString ] ;
[ "region" ; _region ; JSONString ] ;
[ "service" ; _service ; JSONString ] ;
[ "method" ; Upper ( _method ) ; JSONString ] ;
[ "host" ; _host ; JSONString ] ;
[ "canonicalURI" ; _canonicalURI ; JSONString ] ;
[ "canonicalQueryString" ; _canonicalQueryString ; JSONString ] ;
[ "hashedPayload" ; _hashedPayload ; JSONString ] ;
[ "timestamp" ; ~timestampFormat ; JSONString ] ;
[ "date" ; ~dateFormat ; JSONString ]
)
] ;
~envJson
) /*let*/
aws_v4_sign_generate_authorization ( _envJson )
--------------------------------------------------
Let ( [
// env
~isJson = not Exact ( Left ( JSONFormatElements ( _envJson ) ; 1 ) ; "?" ) ;
~env = If ( ~isJson ; _envJson ; "{}" ) ;
~timestamp = JSONGetElement ( ~env ; "timestamp" ) ;
~date = JSONGetElement ( ~env ; "date" ) ;
~region = JSONGetElement ( ~env ; "region" ) ;
~service = JSONGetElement ( ~env ; "service" ) ;
// CanonicalRequest
~method = Upper ( JSONGetElement ( ~env ; "method" ) ) ;
~canonicalURI = JSONGetElement ( ~env ; "canonicalURI" ) ;
~canonicalQueryString = JSONGetElement ( ~env ; "canonicalQueryString" ) ;
~header1 = "host:" & JSONGetElement ( ~env ; "host" ) ;
~header2 = "x-amz-content-sha256:" & JSONGetElement ( ~env ; "hashedPayload" ) ;
~header3 = "x-amz-date:" & ~timestamp ;
~canonicalHeaders = List ( ~header1 ; ~header2 ; ~header3 ) ;
~signedHeaders = "host;x-amz-content-sha256;x-amz-date" ;
~hashedPayload = JSONGetElement ( ~env ; "hashedPayload" ) ;
~canonicalRequest = ~method & "¶" & ~canonicalURI & "¶" & ~canonicalQueryString & "¶" & ~canonicalHeaders & "¶" & "¶" & ~signedHeaders & "¶" & ~hashedPayload ;
// HashCanonicalRequest
~hashCanonicalRequest = Lower ( HexEncode ( CryptDigest ( TextEncode ( ~canonicalRequest ; "utf-8" ; 3 ) ; "SHA256" ) ) ) ;
// CredentialScope
~credentialScope = ~date & "/" & ~region & "/" & ~service & "/aws4_request" ;
// StringToSign
~stringToSign = List ( "AWS4-HMAC-SHA256" ; ~timestamp ; ~credentialScope ; ~hashCanonicalRequest ) ;
// Signature
~kSecret = JSONGetElement ( ~env ; "secretAccessKey" ) ;
~kDate = CryptAuthCode ( ~date ; "SHA256" ; "AWS4" & ~kSecret ) ;
~kRegion = CryptAuthCode ( ~region ; "SHA256" ; ~kDate ) ;
~kService = CryptAuthCode ( ~service ; "SHA256" ; ~kRegion ) ;
~kSigning = CryptAuthCode ( "aws4_request" ; "SHA256" ; ~kService ) ;
~signature = Lower ( HexEncode ( CryptAuthCode ( TextEncode ( ~stringToSign ; "utf-8" ; 3 ) ; "SHA256" ; ~kSigning ) ) ) ;
// Authorization
~authorizationTemplate = "{algorithm} Credential={accessKeyId}/{credentialScope}, SignedHeaders={signedHeaders}, Signature={signature}" ;
~authorization =
Substitute (
~authorizationTemplate ;
[ "{algorithm}" ; "AWS4-HMAC-SHA256" ] ;
[ "{accessKeyId}" ; JSONGetElement ( ~env ; "accessKeyId" ) ] ;
[ "{credentialScope}" ; ~credentialScope ] ;
[ "{signedHeaders}" ; ~signedHeaders ] ;
[ "{signature}" ; ~signature ]
) /*substitute*/
] ;
~authorization
) /*let*/