Pārlūkot izejas kodu

fix bug: StsToken requests fail in the ROA mode

归邪 7 gadi atpakaļ
vecāks
revīzija
7078bd469f

+ 7 - 3
sdk/auth/roa_signature_composer.go

@@ -31,6 +31,8 @@ func signRoaRequest(request requests.AcsRequest, signer Signer, regionId string)
 }
 
 func completeROASignParams(request requests.AcsRequest, signer Signer, regionId string) {
+	headerParams := request.GetHeaders()
+
 	// complete query params
 	queryParams := request.GetQueryParams()
 	if _, ok := queryParams["RegionId"]; !ok {
@@ -38,12 +40,16 @@ func completeROASignParams(request requests.AcsRequest, signer Signer, regionId
 	}
 	if extraParam := signer.GetExtraParam(); extraParam != nil {
 		for key, value := range extraParam {
+			if key == "SecurityToken" {
+				headerParams["x-acs-security-token"] = value
+				continue
+			}
+
 			queryParams[key] = value
 		}
 	}
 
 	// complete header params
-	headerParams := request.GetHeaders()
 	headerParams["Date"] = utils.GetTimeInFormatRFC2616()
 	headerParams["x-acs-signature-method"] = signer.GetName()
 	headerParams["x-acs-signature-version"] = signer.GetVersion()
@@ -100,8 +106,6 @@ func buildRoaStringToSign(request requests.AcsRequest) (stringToSign string) {
 	return
 }
 
-
-
 func appendIfContain(sourceMap map[string]string, target *bytes.Buffer, key, separator string) {
 	if value, contain := sourceMap[key]; contain && len(value) > 0 {
 		target.WriteString(sourceMap[key])

+ 25 - 0
sdk/client_test.go

@@ -512,6 +512,31 @@ func TestRpcGetForRoleArn(t *testing.T) {
 	assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
 }
 
+func TestRoaGetForRoleArn(t *testing.T) {
+	request := getFtTestRoaRequest()
+	request.Method = requests.GET
+
+	response := &responses.BaseResponse{}
+	err := clientRoleArn.DoAction(request, response)
+	assert.Nil(t, err)
+	assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
+	assert.NotNil(t, response.GetHttpContentString())
+
+	var responseBean MockResponse
+	json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
+
+	assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
+
+	err = clientRoleArn.DoAction(request, response)
+	assert.Nil(t, err)
+	assert.Equal(t, http.StatusOK, response.GetHttpStatus(), response.GetHttpContentString())
+	assert.NotNil(t, response.GetHttpContentString())
+
+	json.Unmarshal([]byte(response.GetHttpContentString()), &responseBean)
+
+	assert.Equal(t, "QueryParamValue", responseBean.Params["QueryParam"])
+}
+
 //测试Sts的时候要先获取一套stsToken和ak,由于有时效性,所以先把代码注释掉,测试的时候先获取stsToken完成后再调用
 //func TestRpcGetForSts(t *testing.T) {
 //	request := getFtTestRpcRequest()

+ 1 - 1
sdk/errors/server_error.go

@@ -15,8 +15,8 @@
 package errors
 
 import (
-	"fmt"
 	"encoding/json"
+	"fmt"
 	"github.com/jmespath/go-jmespath"
 )
 

+ 4 - 4
sdk/errors/signature_does_not_match_wrapper.go

@@ -12,14 +12,14 @@ func (*SignatureDostNotMatchWrapper) tryWrap(error *ServerError, wrapInfo map[st
 	clientStringToSign := wrapInfo["StringToSign"]
 	if error.errorCode == SignatureDostNotMatchErrorCode && clientStringToSign != "" {
 		message := error.message
-		if strings.HasPrefix(message, MessagePrefix){
+		if strings.HasPrefix(message, MessagePrefix) {
 			serverStringToSign := message[len(MessagePrefix):len(message)]
-			if clientStringToSign == serverStringToSign{
+			if clientStringToSign == serverStringToSign {
 				// user secret is error
 				error.recommend = "Please check you AccessKeySecret"
-			}else{
+			} else {
 				error.recommend = "This may be a bug with the SDK and we hope you can submit this question in the " +
-						"github issue(https://github.com/aliyun/alibaba-cloud-sdk-go/issues), thanks very much"
+					"github issue(https://github.com/aliyun/alibaba-cloud-sdk-go/issues), thanks very much"
 			}
 		}
 		return true, error

+ 4 - 4
sdk/requests/roa_request.go

@@ -18,9 +18,9 @@ import (
 	"bytes"
 	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
 	"io"
+	"net/url"
 	"sort"
 	"strings"
-	"net/url"
 )
 
 type RoaRequest struct {
@@ -83,9 +83,9 @@ func (request *RoaRequest) buildQueries(needParamEncode bool) string {
 		urlBuilder.WriteString(queryKey)
 		if value := queryParams[queryKey]; len(value) > 0 {
 			urlBuilder.WriteString("=")
-			if needParamEncode{
+			if needParamEncode {
 				urlBuilder.WriteString(url.QueryEscape(value))
-			}else{
+			} else {
 				urlBuilder.WriteString(value)
 			}
 		}
@@ -99,7 +99,7 @@ func (request *RoaRequest) buildQueries(needParamEncode bool) string {
 	return request.queries
 }
 
-func popStandardUrlencode(stringToSign string)(result string){
+func popStandardUrlencode(stringToSign string) (result string) {
 	result = strings.Replace(stringToSign, "+", "%20", -1)
 	result = strings.Replace(result, "*", "%2A", -1)
 	result = strings.Replace(result, "%7E", "~", -1)