in cmd/saml2alibabacloud/commands/console.go [107:169]
func federatedLogin(creds *alibabacloudconfig.AliCloudCredentials, consoleFlags *flags.ConsoleFlags) error {
jsonBytes, err := json.Marshal(map[string]string{
"sessionId": creds.AliCloudAccessKey,
"sessionKey": creds.AliCloudSecretKey,
"sessionToken": creds.AliCloudSessionToken,
})
if err != nil {
return err
}
req, err := http.NewRequest("GET", federationURL, nil)
if err != nil {
return err
}
q := req.URL.Query()
q.Add("Action", "getSigninToken")
q.Add("Session", string(jsonBytes))
req.URL.RawQuery = q.Encode()
resp, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("Call to getSigninToken failed with %v", resp.Status)
}
var respParsed map[string]string
if err = json.Unmarshal([]byte(body), &respParsed); err != nil {
return err
}
signinToken, ok := respParsed["SigninToken"]
if !ok {
return err
}
destination := "https://home.console.aliyun.com/"
loginURL := fmt.Sprintf(
"%s?Action=login&Issuer=%s&Destination=%s&SigninToken=%s",
federationURL,
issuer,
url.QueryEscape(destination),
url.QueryEscape(signinToken),
)
// write the URL to stdout making it easy to capture seperately and use in a shell function
if consoleFlags.Link {
fmt.Println(loginURL)
return nil
}
return open.Run(loginURL)
}