@@ -44,29 +44,33 @@ func (client *Client) ModifyConfiguration(context *spi.InterceptorContext, attri
4444func (client * Client ) ModifyRequest (context * spi.InterceptorContext , attributeMap * spi.AttributeMap ) (_err error ) {
4545 request := context .Request
4646 config := context .Configuration
47+ date := util .GetDateUTCString ()
4748 request .Headers = tea .Merge (map [string ]* string {
48- "date" : util .GetDateUTCString (),
49- "host" : config .Endpoint ,
50- "x-acs-version" : request .Version ,
51- "x-acs-action" : request .Action ,
52- "user-agent" : request .UserAgent ,
53- "x-acs-signature-nonce" : util .GetNonce (),
54- "x-acs-signature-method" : tea .String ("HMAC-SHA1" ),
55- "x-acs-signature-version" : tea .String ("1.0" ),
56- "accept" : tea .String ("application/json" ),
49+ "date" : date ,
50+ "host" : config .Endpoint ,
51+ "x-acs-version" : request .Version ,
52+ "x-acs-action" : request .Action ,
53+ "user-agent" : request .UserAgent ,
54+ "x-acs-signature-nonce" : util .GetNonce (),
55+ "accept" : tea .String ("application/json" ),
5756 }, request .Headers )
57+ signatureAlgorithm := util .DefaultString (request .SignatureAlgorithm , tea .String ("ACS4-HMAC-SHA256" ))
58+ signatureVersion := util .DefaultString (request .SignatureVersion , tea .String ("v1" ))
59+ hashedRequestPayload := encodeutil .HexEncode (encodeutil .Hash (util .ToBytes (tea .String ("" )), signatureAlgorithm ))
5860 if ! tea .BoolValue (util .IsUnset (request .Stream )) {
5961 tmp , _err := util .ReadAsBytes (request .Stream )
6062 if _err != nil {
6163 return _err
6264 }
6365
66+ hashedRequestPayload = encodeutil .HexEncode (encodeutil .Hash (tmp , signatureAlgorithm ))
6467 request .Stream = tea .ToReader (tmp )
6568 request .Headers ["content-type" ] = tea .String ("application/octet-stream" )
6669 } else {
6770 if ! tea .BoolValue (util .IsUnset (request .Body )) {
6871 if tea .BoolValue (util .EqualString (request .ReqBodyType , tea .String ("json" ))) {
6972 jsonObj := util .ToJSONString (request .Body )
73+ hashedRequestPayload = encodeutil .HexEncode (encodeutil .Hash (util .ToBytes (jsonObj ), signatureAlgorithm ))
7074 request .Stream = tea .ToReader (jsonObj )
7175 request .Headers ["content-type" ] = tea .String ("application/json; charset=utf-8" )
7276 } else {
@@ -76,6 +80,7 @@ func (client *Client) ModifyRequest(context *spi.InterceptorContext, attributeMa
7680 }
7781
7882 formObj := openapiutil .ToForm (m )
83+ hashedRequestPayload = encodeutil .HexEncode (encodeutil .Hash (util .ToBytes (formObj ), signatureAlgorithm ))
7984 request .Stream = tea .ToReader (formObj )
8085 request .Headers ["content-type" ] = tea .String ("application/x-www-form-urlencoded" )
8186 }
@@ -84,6 +89,18 @@ func (client *Client) ModifyRequest(context *spi.InterceptorContext, attributeMa
8489
8590 }
8691
92+ if tea .BoolValue (string_ .Equals (signatureVersion , tea .String ("v4" ))) {
93+ if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SM3" ))) {
94+ request .Headers ["x-acs-content-sm3" ] = hashedRequestPayload
95+ } else {
96+ request .Headers ["x-acs-content-sha256" ] = hashedRequestPayload
97+ }
98+
99+ } else {
100+ request .Headers ["x-acs-signature-method" ] = tea .String ("HMAC-SHA1" )
101+ request .Headers ["x-acs-signature-version" ] = tea .String ("1.0" )
102+ }
103+
87104 if ! tea .BoolValue (util .EqualString (request .AuthType , tea .String ("Anonymous" ))) && ! tea .BoolValue (util .IsUnset (request .Credential )) {
88105 credential := request .Credential
89106 credentialModel , _err := credential .GetCredential ()
@@ -104,9 +121,25 @@ func (client *Client) ModifyRequest(context *spi.InterceptorContext, attributeMa
104121 request .Headers ["x-acs-security-token" ] = securityToken
105122 }
106123
107- request .Headers ["Authorization" ], _err = client .GetAuthorization (request .Pathname , request .Method , request .Query , request .Headers , accessKeyId , accessKeySecret )
108- if _err != nil {
109- return _err
124+ if tea .BoolValue (string_ .Equals (signatureVersion , tea .String ("v4" ))) {
125+ dateNew := string_ .SubString (date , tea .Int (0 ), tea .Int (10 ))
126+ region := client .GetRegion (config .Endpoint )
127+ signingkey , _err := client .GetSigningkey (signatureAlgorithm , accessKeySecret , region , dateNew )
128+ if _err != nil {
129+ return _err
130+ }
131+
132+ request .Headers ["Authorization" ], _err = client .GetAuthorizationV4 (request .Pathname , request .Method , request .Query , request .Headers , signatureAlgorithm , hashedRequestPayload , accessKeyId , signingkey , request .ProductId , region , dateNew )
133+ if _err != nil {
134+ return _err
135+ }
136+
137+ } else {
138+ request .Headers ["Authorization" ], _err = client .GetAuthorization (request .Pathname , request .Method , request .Query , request .Headers , accessKeyId , accessKeySecret )
139+ if _err != nil {
140+ return _err
141+ }
142+
110143 }
111144
112145 }
@@ -320,3 +353,101 @@ func (client *Client) GetSignedHeaders(headers map[string]*string) (_result []*s
320353 _result = _body
321354 return _result , _err
322355}
356+
357+ func (client * Client ) GetRegion (endpoint * string ) (_result * string ) {
358+ region := tea .String ("center" )
359+ if tea .BoolValue (util .Empty (endpoint )) {
360+ _result = region
361+ return _result
362+ }
363+
364+ if tea .BoolValue (string_ .Contains (endpoint , tea .String (".admin.aliyunpds.com" ))) {
365+ region = string_ .Replace (endpoint , tea .String (".admin.aliyunpds.com" ), tea .String ("" ), nil )
366+ }
367+
368+ _result = region
369+ return _result
370+ }
371+
372+ func (client * Client ) GetSigningkey (signatureAlgorithm * string , secret * string , region * string , date * string ) (_result []byte , _err error ) {
373+ sc1 := tea .String ("aliyun_v4" + tea .StringValue (secret ))
374+ sc2 := util .ToBytes (tea .String ("" ))
375+ if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SHA256" ))) {
376+ sc2 = signatureutil .HmacSHA256Sign (date , sc1 )
377+ } else if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SM3" ))) {
378+ sc2 = signatureutil .HmacSM3Sign (date , sc1 )
379+ }
380+
381+ sc3 := util .ToBytes (tea .String ("" ))
382+ if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SHA256" ))) {
383+ sc3 = signatureutil .HmacSHA256SignByBytes (region , sc2 )
384+ } else if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SM3" ))) {
385+ sc3 = signatureutil .HmacSM3SignByBytes (region , sc2 )
386+ }
387+
388+ sc4 := util .ToBytes (tea .String ("" ))
389+ if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SHA256" ))) {
390+ sc4 = signatureutil .HmacSHA256SignByBytes (tea .String ("pds" ), sc3 )
391+ } else if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SM3" ))) {
392+ sc4 = signatureutil .HmacSM3SignByBytes (tea .String ("pds" ), sc3 )
393+ }
394+
395+ hmac := util .ToBytes (tea .String ("" ))
396+ if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SHA256" ))) {
397+ hmac = signatureutil .HmacSHA256SignByBytes (tea .String ("aliyun_v4_request" ), sc4 )
398+ } else if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SM3" ))) {
399+ hmac = signatureutil .HmacSM3SignByBytes (tea .String ("aliyun_v4_request" ), sc4 )
400+ }
401+
402+ _result = hmac
403+ return _result , _err
404+ }
405+
406+ func (client * Client ) GetAuthorizationV4 (pathname * string , method * string , query map [string ]* string , headers map [string ]* string , signatureAlgorithm * string , payload * string , ak * string , signingkey []byte , product * string , region * string , date * string ) (_result * string , _err error ) {
407+ signature , _err := client .GetSignatureV4 (pathname , method , query , headers , signatureAlgorithm , payload , signingkey )
408+ if _err != nil {
409+ return _result , _err
410+ }
411+
412+ signedHeaders , _err := client .GetSignedHeaders (headers )
413+ if _err != nil {
414+ return _result , _err
415+ }
416+
417+ signedHeadersStr := array .Join (signedHeaders , tea .String (";" ))
418+ _result = tea .String (tea .StringValue (signatureAlgorithm ) + " Credential=" + tea .StringValue (ak ) + "/" + tea .StringValue (date ) + "/" + tea .StringValue (region ) + "/" + tea .StringValue (product ) + "/aliyun_v4_request,SignedHeaders=" + tea .StringValue (signedHeadersStr ) + ",Signature=" + tea .StringValue (signature ))
419+ return _result , _err
420+ }
421+
422+ func (client * Client ) GetSignatureV4 (pathname * string , method * string , query map [string ]* string , headers map [string ]* string , signatureAlgorithm * string , payload * string , signingkey []byte ) (_result * string , _err error ) {
423+ stringToSign := tea .String ("" )
424+ canonicalizedResource , _err := client .BuildCanonicalizedResource (pathname , query )
425+ if _err != nil {
426+ return _result , _err
427+ }
428+
429+ canonicalizedHeaders , _err := client .BuildCanonicalizedHeaders (headers )
430+ if _err != nil {
431+ return _result , _err
432+ }
433+
434+ signedHeaders , _err := client .GetSignedHeaders (headers )
435+ if _err != nil {
436+ return _result , _err
437+ }
438+
439+ signedHeadersStr := array .Join (signedHeaders , tea .String (";" ))
440+ stringToSign = tea .String (tea .StringValue (method ) + "\n " + tea .StringValue (canonicalizedResource ) + "\n " + tea .StringValue (canonicalizedHeaders ) + "\n " + tea .StringValue (signedHeadersStr ) + "\n " + tea .StringValue (payload ))
441+ hex := encodeutil .HexEncode (encodeutil .Hash (util .ToBytes (stringToSign ), signatureAlgorithm ))
442+ stringToSign = tea .String (tea .StringValue (signatureAlgorithm ) + "\n " + tea .StringValue (hex ))
443+ signature := util .ToBytes (tea .String ("" ))
444+ if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SHA256" ))) {
445+ signature = signatureutil .HmacSHA256SignByBytes (stringToSign , signingkey )
446+ } else if tea .BoolValue (util .EqualString (signatureAlgorithm , tea .String ("ACS4-HMAC-SM3" ))) {
447+ signature = signatureutil .HmacSM3SignByBytes (stringToSign , signingkey )
448+ }
449+
450+ _body := encodeutil .HexEncode (signature )
451+ _result = _body
452+ return _result , _err
453+ }
0 commit comments