1/* 2 * Licensed under the Apache License, Version 2.0 (the "License"); 3 * you may not use this file except in compliance with the License. 4 * You may obtain a copy of the License at 5 * 6 * http://www.apache.org/licenses/LICENSE-2.0 7 * 8 * Unless required by applicable law or agreed to in writing, software 9 * distributed under the License is distributed on an "AS IS" BASIS, 10 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 * See the License for the specific language governing permissions and 12 * limitations under the License. 13 */ 14 15package auth 16 17import ( 18 "net/url" 19 "strings" 20 21 "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" 22 "github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils" 23) 24 25var hookGetNonce = func(fn func() string) string { 26 return fn() 27} 28 29func signRpcRequest(request requests.AcsRequest, signer Signer, regionId string) (err error) { 30 err = completeRpcSignParams(request, signer, regionId) 31 if err != nil { 32 return 33 } 34 // remove while retry 35 if _, containsSign := request.GetQueryParams()["Signature"]; containsSign { 36 delete(request.GetQueryParams(), "Signature") 37 } 38 stringToSign := buildRpcStringToSign(request) 39 request.SetStringToSign(stringToSign) 40 signature := signer.Sign(stringToSign, "&") 41 request.GetQueryParams()["Signature"] = signature 42 43 return 44} 45 46func completeRpcSignParams(request requests.AcsRequest, signer Signer, regionId string) (err error) { 47 queryParams := request.GetQueryParams() 48 queryParams["Version"] = request.GetVersion() 49 queryParams["Action"] = request.GetActionName() 50 queryParams["Format"] = request.GetAcceptFormat() 51 queryParams["Timestamp"] = hookGetDate(utils.GetTimeInFormatISO8601) 52 queryParams["SignatureMethod"] = signer.GetName() 53 queryParams["SignatureType"] = signer.GetType() 54 queryParams["SignatureVersion"] = signer.GetVersion() 55 queryParams["SignatureNonce"] = hookGetNonce(utils.GetUUID) 56 queryParams["AccessKeyId"], err = signer.GetAccessKeyId() 57 58 if err != nil { 59 return 60 } 61 62 if _, contains := queryParams["RegionId"]; !contains { 63 queryParams["RegionId"] = regionId 64 } 65 if extraParam := signer.GetExtraParam(); extraParam != nil { 66 for key, value := range extraParam { 67 queryParams[key] = value 68 } 69 } 70 71 request.GetHeaders()["Content-Type"] = requests.Form 72 formString := utils.GetUrlFormedMap(request.GetFormParams()) 73 request.SetContent([]byte(formString)) 74 75 return 76} 77 78func buildRpcStringToSign(request requests.AcsRequest) (stringToSign string) { 79 signParams := make(map[string]string) 80 for key, value := range request.GetQueryParams() { 81 signParams[key] = value 82 } 83 for key, value := range request.GetFormParams() { 84 signParams[key] = value 85 } 86 87 stringToSign = utils.GetUrlFormedMap(signParams) 88 stringToSign = strings.Replace(stringToSign, "+", "%20", -1) 89 stringToSign = strings.Replace(stringToSign, "*", "%2A", -1) 90 stringToSign = strings.Replace(stringToSign, "%7E", "~", -1) 91 stringToSign = url.QueryEscape(stringToSign) 92 stringToSign = request.GetMethod() + "&%2F&" + stringToSign 93 return 94} 95