sdk/auth/rpc_signature_composer.go (63 lines of code) (raw):
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package auth
import (
"net/url"
"strings"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
)
var hookGetNonce = func(fn func() string) string {
return fn()
}
func signRpcRequest(request requests.AcsRequest, regionId string, provider credentials.CredentialsProvider) (err error) {
cc, err := provider.GetCredentials()
if err != nil {
return
}
queryParams := request.GetQueryParams()
queryParams["Version"] = request.GetVersion()
queryParams["Action"] = request.GetActionName()
queryParams["Format"] = request.GetAcceptFormat()
queryParams["Timestamp"] = hookGetDate(utils.GetTimeInFormatISO8601)
queryParams["SignatureMethod"] = "HMAC-SHA1"
queryParams["SignatureVersion"] = "1.0"
queryParams["SignatureType"] = ""
queryParams["SignatureNonce"] = hookGetNonce(utils.GetNonce)
queryParams["AccessKeyId"] = cc.AccessKeyId
if _, contains := queryParams["RegionId"]; !contains {
queryParams["RegionId"] = regionId
}
if cc.SecurityToken != "" {
queryParams["SecurityToken"] = cc.SecurityToken
}
if cc.BearerToken != "" {
queryParams["BearerToken"] = cc.BearerToken
queryParams["SignatureType"] = "BEARERTOKEN"
}
request.GetHeaders()["Content-Type"] = requests.Form
request.GetHeaders()["x-acs-credentials-provider"] = cc.ProviderName
formString := utils.GetUrlFormedMap(request.GetFormParams())
request.SetContent([]byte(formString))
// remove while retry
delete(request.GetQueryParams(), "Signature")
stringToSign := buildRpcStringToSign(request)
request.SetStringToSign(stringToSign)
secret := cc.AccessKeySecret + "&"
request.GetQueryParams()["Signature"] = utils.ShaHmac1(stringToSign, secret)
return
}
func buildRpcStringToSign(request requests.AcsRequest) (stringToSign string) {
signParams := make(map[string]string)
for key, value := range request.GetQueryParams() {
signParams[key] = value
}
for key, value := range request.GetFormParams() {
signParams[key] = value
}
stringToSign = utils.GetUrlFormedMap(signParams)
stringToSign = strings.Replace(stringToSign, "+", "%20", -1)
stringToSign = strings.Replace(stringToSign, "*", "%2A", -1)
stringToSign = strings.Replace(stringToSign, "%7E", "~", -1)
stringToSign = url.QueryEscape(stringToSign)
stringToSign = request.GetMethod() + "&%2F&" + stringToSign
return
}