in sdk/auth/credentials/credentials.go [335:424]
func (provider *RSAKeyPairCredentialsProvider) getCredentials() (sessionAK *sessionAccessKey, err error) {
method := "POST"
host := "sts.ap-northeast-1.aliyuncs.com"
queries := make(map[string]string)
queries["Version"] = "2015-04-01"
queries["Action"] = "GenerateSessionAccessKey"
queries["Format"] = "JSON"
queries["Timestamp"] = utils.GetTimeInFormatISO8601()
queries["SignatureMethod"] = "SHA256withRSA"
queries["SignatureVersion"] = "1.0"
queries["SignatureNonce"] = utils.GetNonce()
queries["PublicKeyId"] = provider.PublicKeyId
queries["SignatureType"] = "PRIVATEKEY"
bodyForm := make(map[string]string)
bodyForm["DurationSeconds"] = strconv.Itoa(provider.durationSeconds)
// caculate signature
signParams := make(map[string]string)
for key, value := range queries {
signParams[key] = value
}
for key, value := range bodyForm {
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 = method + "&%2F&" + stringToSign
queries["Signature"] = utils.Sha256WithRsa(stringToSign, provider.PrivateKeyId)
querystring := utils.GetUrlFormedMap(queries)
// do request
httpUrl := fmt.Sprintf("https://%s/?%s", host, querystring)
body := utils.GetUrlFormedMap(bodyForm)
httpRequest, err := hookNewRequest(http.NewRequest)(method, httpUrl, strings.NewReader(body))
if err != nil {
return
}
// set headers
httpRequest.Header["Accept-Encoding"] = []string{"identity"}
httpRequest.Header["Content-Type"] = []string{"application/x-www-form-urlencoded"}
httpClient := &http.Client{}
httpResponse, err := hookDo(httpClient.Do)(httpRequest)
if err != nil {
return
}
defer httpResponse.Body.Close()
responseBody, err := ioutil.ReadAll(httpResponse.Body)
if err != nil {
return
}
if httpResponse.StatusCode != http.StatusOK {
message := "refresh temp ak failed"
err = errors.NewServerError(httpResponse.StatusCode, string(responseBody), message)
return
}
var data generateSessionAccessKeyResponse
err = json.Unmarshal(responseBody, &data)
if err != nil {
err = fmt.Errorf("refresh temp ak err, json.Unmarshal fail: %s", err.Error())
return
}
if data.SessionAccessKey == nil {
err = fmt.Errorf("refresh temp ak token err, fail to get credentials")
return
}
if data.SessionAccessKey.SessionAccessKeyId == nil || data.SessionAccessKey.SessionAccessKeySecret == nil {
err = fmt.Errorf("refresh temp ak token err, fail to get credentials")
return
}
sessionAK = data.SessionAccessKey
return
}