Skip to content

Commit 3ea74ee

Browse files
committed
[pds gateway]feat: support signature v4
1 parent 164f189 commit 3ea74ee

File tree

14 files changed

+1082
-123
lines changed

14 files changed

+1082
-123
lines changed

alibabacloud-gateway-pds/csharp/core/Client.cs

Lines changed: 228 additions & 8 deletions
Large diffs are not rendered by default.

alibabacloud-gateway-pds/csharp/core/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@
2929
// Build Number
3030
// Revision
3131
//
32-
[assembly: AssemblyVersion("0.0.9.0")]
33-
[assembly: AssemblyFileVersion("0.0.9.0")]
32+
[assembly: AssemblyVersion("0.0.10.0")]
33+
[assembly: AssemblyFileVersion("0.0.10.0")]

alibabacloud-gateway-pds/csharp/core/client.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@
4141
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
4242
</PackageReference>
4343
<PackageReference Include="AlibabaCloud.GatewaySpi" Version="0.0.3"/>
44-
<PackageReference Include="Aliyun.Credentials" Version="1.4.0"/>
45-
<PackageReference Include="AlibabaCloud.TeaUtil" Version="0.1.18"/>
46-
<PackageReference Include="AlibabaCloud.OpenApiUtil" Version="1.1.1"/>
44+
<PackageReference Include="Aliyun.Credentials" Version="1.4.2"/>
45+
<PackageReference Include="AlibabaCloud.TeaUtil" Version="0.1.19"/>
46+
<PackageReference Include="AlibabaCloud.OpenApiUtil" Version="1.1.2"/>
4747
<PackageReference Include="AlibabaCloud.DarabonbaEncodeUtil" Version="0.0.2"/>
48-
<PackageReference Include="AlibabaCloud.DarabonbaSignatureUtil" Version="0.0.4"/>
48+
<PackageReference Include="AlibabaCloud.DarabonbaSignatureUtil" Version="0.0.5"/>
4949
<PackageReference Include="AlibabaCloud.DarabonbaString" Version="1.0.3"/>
5050
<PackageReference Include="AlibabaCloud.DarabonbaMap" Version="0.0.2"/>
5151
<PackageReference Include="AlibabaCloud.DarabonbaArray" Version="0.1.0"/>

alibabacloud-gateway-pds/golang/client/client.go

Lines changed: 143 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,33 @@ func (client *Client) ModifyConfiguration(context *spi.InterceptorContext, attri
4444
func (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+
}

alibabacloud-gateway-pds/golang/go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ require (
99
github.com/alibabacloud-go/darabonba-map v0.0.2
1010
github.com/alibabacloud-go/darabonba-signature-util v0.0.7
1111
github.com/alibabacloud-go/darabonba-string v1.0.2
12-
github.com/alibabacloud-go/openapi-util v0.1.0
12+
github.com/alibabacloud-go/openapi-util v0.1.1
1313
github.com/alibabacloud-go/tea v1.1.19
14-
github.com/alibabacloud-go/tea-utils/v2 v2.0.5
15-
github.com/aliyun/credentials-go v1.3.6
14+
github.com/alibabacloud-go/tea-utils/v2 v2.0.6
15+
github.com/aliyun/credentials-go v1.3.10
1616
)

alibabacloud-gateway-pds/java/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,17 @@
5454
<dependency>
5555
<groupId>com.aliyun</groupId>
5656
<artifactId>credentials-java</artifactId>
57-
<version>0.3.6</version>
57+
<version>0.3.10</version>
5858
</dependency>
5959
<dependency>
6060
<groupId>com.aliyun</groupId>
6161
<artifactId>tea-util</artifactId>
62-
<version>0.2.22</version>
62+
<version>0.2.23</version>
6363
</dependency>
6464
<dependency>
6565
<groupId>com.aliyun</groupId>
6666
<artifactId>openapiutil</artifactId>
67-
<version>0.2.1</version>
67+
<version>0.2.2</version>
6868
</dependency>
6969
<dependency>
7070
<groupId>com.aliyun</groupId>

0 commit comments

Comments
 (0)