88package credentials
99
1010import (
11+ "context"
1112 "encoding/json"
1213 "fmt"
1314 "io"
1415 "time"
1516
16- "github.com/aws/aws-sdk-go/aws"
17- "github.com/aws/aws-sdk-go/aws/credentials"
18- "github.com/aws/aws-sdk-go/aws/request"
19- "github.com/aws/aws-sdk-go/aws/session"
20- "github.com/aws/aws-sdk-go/service/sts"
17+ "github.com/aws/aws-sdk-go-v2/aws"
18+ "github.com/aws/aws-sdk-go-v2/config"
19+ "github.com/aws/aws-sdk-go-v2/credentials"
20+ "github.com/aws/aws-sdk-go-v2/credentials/processcreds"
21+ "github.com/aws/aws-sdk-go-v2/service/sts"
22+ "github.com/aws/aws-sdk-go-v2/service/sts/types"
2123)
2224
2325// FromConfig retrieves credentials from the AWS cli config files, typically
2426// ~/.aws/credentials and ~/.aws/config. Credentials for the named profile are
2527// returned, or the default profile if no name is given. Additionally, the
2628// value of $AWS_PROFILE will be used if it is set.
27- func FromConfig (profile string ) (* sts.Credentials , string , error ) {
28- sess , err := session .NewSessionWithOptions (session.Options {
29- Profile : profile ,
30- SharedConfigState : session .SharedConfigEnable ,
31- })
29+ func FromConfig (profile string ) (* aws.Credentials , string , error ) {
30+ ctx := context .Background ()
31+
32+ cfg , err := config .LoadDefaultConfig (ctx , config .WithSharedConfigProfile (profile ))
3233 if err != nil {
3334 return nil , "" , err
3435 }
3536
36- value , err := sess . Config . Credentials .Get ( )
37+ creds , err := cfg . Credentials .Retrieve ( ctx )
3738 if err != nil {
3839 return nil , "" , err
3940 }
4041
41- return & sts.Credentials {
42- AccessKeyId : aws .String (value .AccessKeyID ),
43- SecretAccessKey : aws .String (value .SecretAccessKey ),
44- SessionToken : aws .String (value .SessionToken ),
45- }, aws .StringValue (sess .Config .Region ), nil
42+ return & creds , cfg .Region , nil
4643}
4744
4845// FromReader retrieves credentials from given io.Reader, typically os.Stdin.
@@ -72,36 +69,32 @@ func FromConfig(profile string) (*sts.Credentials, string, error) {
7269//
7370// See https://docs.aws.amazon.com/cli/latest/reference/sts/assume-role.html#output.
7471// See https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sourcing-external.html.
75- func FromReader (reader io.Reader ) (* sts .Credentials , error ) {
72+ func FromReader (reader io.Reader ) (* aws .Credentials , error ) {
7673 // Read the entire body, as it will be potentially parsed multiple times.
7774 body , err := io .ReadAll (reader )
7875 if err != nil {
7976 return nil , err
8077 }
8178
8279 type creds struct {
83- Credentials struct {
84- AccessKeyID string `json:"AccessKeyId"`
85- SecretAccessKey string `json:"SecretAccessKey"`
86- SessionToken string `json:"SessionToken"`
87- } `json:"Credentials"`
80+ Credentials processcreds.CredentialProcessResponse `json:"Credentials"`
8881 }
8982
9083 var result creds
9184
9285 if err := json .Unmarshal (body , & result ); err == nil && result .Credentials .AccessKeyID != "" && result .Credentials .SecretAccessKey != "" {
93- // Credentials were unmarshaled into the entire struct.
94- return & sts .Credentials {
95- AccessKeyId : aws . String ( result .Credentials .AccessKeyID ) ,
96- SecretAccessKey : aws . String ( result .Credentials .SecretAccessKey ) ,
97- SessionToken : aws . String ( result .Credentials .SessionToken ) ,
86+ // Credentials were unmarshalled into the entire struct.
87+ return & aws .Credentials {
88+ AccessKeyID : result .Credentials .AccessKeyID ,
89+ SecretAccessKey : result .Credentials .SecretAccessKey ,
90+ SessionToken : result .Credentials .SessionToken ,
9891 }, nil
9992 } else if err := json .Unmarshal (body , & result .Credentials ); err == nil && result .Credentials .AccessKeyID != "" && result .Credentials .SecretAccessKey != "" {
100- // Credentials were unmarshaled into part of the struct.
101- return & sts .Credentials {
102- AccessKeyId : aws . String ( result .Credentials .AccessKeyID ) ,
103- SecretAccessKey : aws . String ( result .Credentials .SecretAccessKey ) ,
104- SessionToken : aws . String ( result .Credentials .SessionToken ) ,
93+ // Credentials were unmarshalled into part of the struct.
94+ return & aws .Credentials {
95+ AccessKeyID : result .Credentials .AccessKeyID ,
96+ SecretAccessKey : result .Credentials .SecretAccessKey ,
97+ SessionToken : result .Credentials .SessionToken ,
10598 }, nil
10699 }
107100
@@ -112,27 +105,24 @@ func FromReader(reader io.Reader) (*sts.Credentials, error) {
112105// FederateUser will federate the given user credentials by calling STS
113106// GetFederationToken. If the given credentials are not for a user (like
114107// credentials for a role) then they are returned unmodified.
115- func FederateUser (creds * sts .Credentials , name , policy string , duration time.Duration , userAgent string ) (* sts .Credentials , error ) {
108+ func FederateUser (creds * aws .Credentials , region , name , policy string , duration time.Duration , userAgent string ) (* aws .Credentials , error ) {
116109 // Only federate if user credentials were given.
117- if aws . StringValue ( creds .SessionToken ) != "" {
110+ if creds .SessionToken != "" {
118111 return creds , nil
119112 }
120113
121- // Create a new session given the static user credentials.
122- sess , err := session .NewSession (& aws.Config {
123- Credentials : credentials .NewStaticCredentials (
124- aws .StringValue (creds .AccessKeyId ),
125- aws .StringValue (creds .SecretAccessKey ),
126- aws .StringValue (creds .SessionToken ),
114+ client := sts .NewFromConfig (aws.Config {
115+ Credentials : credentials .NewStaticCredentialsProvider (
116+ creds .AccessKeyID ,
117+ creds .SecretAccessKey ,
118+ creds .SessionToken ,
127119 ),
120+ Region : region ,
128121 })
129- if err != nil {
130- return nil , err
131- }
132122
133123 input := sts.GetFederationTokenInput {
134124 Name : aws .String (name ),
135- PolicyArns : []* sts .PolicyDescriptorType {{
125+ PolicyArns : []types .PolicyDescriptorType {{
136126 Arn : aws .String (policy ),
137127 }},
138128 }
@@ -145,18 +135,18 @@ func FederateUser(creds *sts.Credentials, name, policy string, duration time.Dur
145135 }
146136
147137 if duration != 0 {
148- input .DurationSeconds = aws .Int64 ( int64 (duration .Seconds ()))
138+ input .DurationSeconds = aws .Int32 ( int32 (duration .Seconds ()))
149139 }
150140
151- // Configure client.
152- client := sts .New (sess )
153- client .Handlers .Build .PushBack (request .WithSetRequestHeaders (map [string ]string {"User-Agent" : userAgent }))
154-
155141 // Federate the user.
156- result , err := client .GetFederationToken (& input )
142+ result , err := client .GetFederationToken (context . Background (), & input )
157143 if err != nil {
158144 return nil , err
159145 }
160146
161- return result .Credentials , nil
147+ return & aws.Credentials {
148+ AccessKeyID : aws .ToString (result .Credentials .AccessKeyId ),
149+ SecretAccessKey : aws .ToString (result .Credentials .SecretAccessKey ),
150+ SessionToken : aws .ToString (result .Credentials .SessionToken ),
151+ }, nil
162152}
0 commit comments