in sdk/auth/credentials/credentials.go [1011:1099]
func (provider *ECSRAMRoleCredentialsProvider) getCredentials() (sessionCredentials *SessionCredentials, err error) {
roleName := provider.roleName
if roleName == "" {
roleName, err = provider.getRoleName()
if err != nil {
return
}
}
connectTimeout := 1 * time.Second
readTimeout := 1 * time.Second
if provider.httpOptions != nil && provider.httpOptions.ConnectTimeout > 0 {
connectTimeout = provider.httpOptions.ConnectTimeout
}
if provider.httpOptions != nil && provider.httpOptions.ReadTimeout > 0 {
readTimeout = provider.httpOptions.ReadTimeout
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.DialContext = func(ctx context.Context, network, address string) (net.Conn, error) {
return (&net.Dialer{
Timeout: connectTimeout,
DualStack: true,
}).DialContext(ctx, network, address)
}
httpClient := &http.Client{
Timeout: connectTimeout + readTimeout,
Transport: transport,
}
var requestUrl = "http://100.100.100.200/latest/meta-data/ram/security-credentials/" + roleName
httpRequest, err := hookNewRequest(http.NewRequest)("GET", requestUrl, strings.NewReader(""))
if err != nil {
err = fmt.Errorf("refresh Ecs sts token err: %s", err.Error())
return
}
metadataToken, err := provider.getMetadataToken()
if err != nil {
return
}
if metadataToken != "" {
httpRequest.Header.Set("X-aliyun-ecs-metadata-token", metadataToken)
}
httpResponse, err := hookDo(httpClient.Do)(httpRequest)
if err != nil {
err = fmt.Errorf("refresh Ecs sts token err: %s", err.Error())
return
}
defer httpResponse.Body.Close()
responseBody, err := ioutil.ReadAll(httpResponse.Body)
if err != nil {
return
}
if httpResponse.StatusCode != http.StatusOK {
err = fmt.Errorf("refresh Ecs sts token err, httpStatus: %d, message = %s", httpResponse.StatusCode, string(responseBody))
return
}
var data ecsRAMRoleCredentials
err = json.Unmarshal(responseBody, &data)
if err != nil {
err = fmt.Errorf("refresh Ecs sts token err, json.Unmarshal fail: %s", err.Error())
return
}
if data.AccessKeyId == nil || data.AccessKeySecret == nil || data.SecurityToken == nil {
err = fmt.Errorf("refresh Ecs sts token err, fail to get credentials")
return
}
if *data.Code != "Success" {
err = fmt.Errorf("refresh Ecs sts token err, Code is not Success")
return
}
sessionCredentials = &SessionCredentials{
AccessKeyId: *data.AccessKeyId,
AccessKeySecret: *data.AccessKeySecret,
SecurityToken: *data.SecurityToken,
Expiration: *data.Expiration,
}
return
}