|
5 | 5 | "os" |
6 | 6 |
|
7 | 7 | "github.com/aws/aws-sdk-go/aws" |
| 8 | + "github.com/aws/aws-sdk-go/aws/credentials" |
8 | 9 | "github.com/aws/aws-sdk-go/aws/session" |
9 | 10 | "github.com/aws/aws-sdk-go/service/sts" |
10 | 11 | "github.com/dnitsch/aws-cli-auth/internal/config" |
@@ -85,3 +86,37 @@ func LoginAwsWebToken(username string) (*util.AWSCredentials, error) { |
85 | 86 | Expires: resp.Credentials.Expiration.Local(), |
86 | 87 | }, nil |
87 | 88 | } |
| 89 | + |
| 90 | +func AssumeRoleWithCreds(creds *util.AWSCredentials, username, role string) (*util.AWSCredentials, error) { |
| 91 | + sess, err := session.NewSession() |
| 92 | + if err != nil { |
| 93 | + return nil, errors.Wrap(err, "Failed to create session") |
| 94 | + } |
| 95 | + |
| 96 | + specificCreds := credentials.NewStaticCredentialsFromCreds(credentials.Value{ |
| 97 | + AccessKeyID: creds.AWSAccessKey, |
| 98 | + SecretAccessKey: creds.AWSSecretKey, |
| 99 | + SessionToken: creds.AWSSessionToken, |
| 100 | + }) |
| 101 | + |
| 102 | + svc := sts.New(sess, aws.NewConfig().WithCredentials(specificCreds)) |
| 103 | + sessionName := util.SessionName(username, config.SELF_NAME) |
| 104 | + |
| 105 | + input := &sts.AssumeRoleInput{ |
| 106 | + RoleArn: &role, |
| 107 | + RoleSessionName: &sessionName, |
| 108 | + } |
| 109 | + roleCreds, err := svc.AssumeRole(input) |
| 110 | + |
| 111 | + if err != nil { |
| 112 | + return nil, errors.Wrap(err, "Failed to retrieve STS credentials using Role Provided") |
| 113 | + } |
| 114 | + |
| 115 | + return &util.AWSCredentials{ |
| 116 | + AWSAccessKey: aws.StringValue(roleCreds.Credentials.AccessKeyId), |
| 117 | + AWSSecretKey: aws.StringValue(roleCreds.Credentials.SecretAccessKey), |
| 118 | + AWSSessionToken: aws.StringValue(roleCreds.Credentials.SessionToken), |
| 119 | + PrincipalARN: aws.StringValue(roleCreds.AssumedRoleUser.Arn), |
| 120 | + Expires: roleCreds.Credentials.Expiration.Local(), |
| 121 | + }, nil |
| 122 | +} |
0 commit comments