in cmd/saml2alibabacloud/commands/login.go [20:101]
func Login(loginFlags *flags.LoginExecFlags) error {
logger := logrus.WithField("command", "login")
account, err := buildIdpAccount(loginFlags)
if err != nil {
return errors.Wrap(err, "error building login details")
}
sharedCreds := alibabacloudconfig.NewSharedCredentials(account.Profile)
logger.Debug("check if Creds Exist")
// this checks if the credentials file has been created yet
exist, err := sharedCreds.CredsExists()
if err != nil {
return errors.Wrap(err, "error loading credentials")
}
if !exist {
log.Println("unable to load credentials, login required to create them")
return nil
}
if !sharedCreds.Expired() && !loginFlags.Force {
log.Println("credentials are not expired skipping")
return nil
}
loginDetails, err := resolveLoginDetails(account, loginFlags)
if err != nil {
log.Printf("%+v", err)
os.Exit(1)
}
err = loginDetails.Validate()
if err != nil {
return errors.Wrap(err, "error validating login details")
}
logger.WithField("idpAccount", account).Debug("building provider")
provider, err := saml2alibabacloud.NewSAMLClient(account)
if err != nil {
return errors.Wrap(err, "error building IdP client")
}
log.Printf("Authenticating as %s ...", loginDetails.Username)
samlAssertion, err := provider.Authenticate(loginDetails)
if err != nil {
return errors.Wrap(err, "error authenticating to IdP")
}
if samlAssertion == "" {
log.Println("Response did not contain a valid SAML assertion")
log.Println("Please check your username and password is correct")
log.Println("To see the output follow the instructions in https://github.com/aliyun/saml2alibabacloud#debugging-issues-with-idps")
os.Exit(1)
}
if !loginFlags.CommonFlags.DisableKeychain {
err = credentials.SaveCredentials(loginDetails.URL, loginDetails.Username, loginDetails.Password)
if err != nil {
return errors.Wrap(err, "error storing password in keychain")
}
}
role, err := selectRamRole(samlAssertion, account)
if err != nil {
return errors.Wrap(err, "Failed to assume role, please check whether you are permitted to assume the given role for the AlibabaCloud STS service")
}
log.Println("Selected role:", role.RoleARN)
alibabacloudCreds, err := loginToStsUsingRole(account, role, samlAssertion)
if err != nil {
return errors.Wrap(err, "error logging into AlibabaCloud role using saml assertion")
}
return saveCredentials(alibabacloudCreds, sharedCreds)
}