in credentials/providers/ram_role_arn.go [224:331]
func (provider *RAMRoleARNCredentialsProvider) getCredentials(cc *Credentials) (session *sessionCredentials, err error) {
method := "POST"
req := &httputil.Request{
Method: method,
Protocol: "https",
Host: provider.stsEndpoint,
Headers: map[string]string{},
}
queries := make(map[string]string)
queries["Version"] = "2015-04-01"
queries["Action"] = "AssumeRole"
queries["Format"] = "JSON"
queries["Timestamp"] = utils.GetTimeInFormatISO8601()
queries["SignatureMethod"] = "HMAC-SHA1"
queries["SignatureVersion"] = "1.0"
queries["SignatureNonce"] = utils.GetNonce()
queries["AccessKeyId"] = cc.AccessKeyId
if cc.SecurityToken != "" {
queries["SecurityToken"] = cc.SecurityToken
}
bodyForm := make(map[string]string)
bodyForm["RoleArn"] = provider.roleArn
if provider.policy != "" {
bodyForm["Policy"] = provider.policy
}
if provider.externalId != "" {
bodyForm["ExternalId"] = provider.externalId
}
bodyForm["RoleSessionName"] = provider.roleSessionName
bodyForm["DurationSeconds"] = strconv.Itoa(provider.durationSeconds)
req.Form = bodyForm
// 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
secret := cc.AccessKeySecret + "&"
queries["Signature"] = utils.ShaHmac1(stringToSign, secret)
req.Queries = queries
// set headers
req.Headers["Accept-Encoding"] = "identity"
req.Headers["Content-Type"] = "application/x-www-form-urlencoded"
req.Headers["x-acs-credentials-provider"] = cc.ProviderName
connectTimeout := 5 * time.Second
readTimeout := 10 * time.Second
if provider.httpOptions != nil && provider.httpOptions.ConnectTimeout > 0 {
connectTimeout = time.Duration(provider.httpOptions.ConnectTimeout) * time.Millisecond
}
if provider.httpOptions != nil && provider.httpOptions.ReadTimeout > 0 {
readTimeout = time.Duration(provider.httpOptions.ReadTimeout) * time.Millisecond
}
if provider.httpOptions != nil && provider.httpOptions.Proxy != "" {
req.Proxy = provider.httpOptions.Proxy
}
req.ConnectTimeout = connectTimeout
req.ReadTimeout = readTimeout
res, err := httpDo(req)
if err != nil {
return
}
if res.StatusCode != http.StatusOK {
err = errors.New("refresh session token failed: " + string(res.Body))
return
}
var data assumeRoleResponse
err = json.Unmarshal(res.Body, &data)
if err != nil {
err = fmt.Errorf("refresh RoleArn sts token err, json.Unmarshal fail: %s", err.Error())
return
}
if data.Credentials == nil {
err = fmt.Errorf("refresh RoleArn sts token err, fail to get credentials")
return
}
if data.Credentials.AccessKeyId == nil || data.Credentials.AccessKeySecret == nil || data.Credentials.SecurityToken == nil {
err = fmt.Errorf("refresh RoleArn sts token err, fail to get credentials")
return
}
session = &sessionCredentials{
AccessKeyId: *data.Credentials.AccessKeyId,
AccessKeySecret: *data.Credentials.AccessKeySecret,
SecurityToken: *data.Credentials.SecurityToken,
Expiration: *data.Credentials.Expiration,
}
return
}