func()

in pkg/provider/f5apm/f5apm.go [113:150]


func (ac *Client) getSAMLAssertion(loginDetails *creds.LoginDetails) (string, error) {
	req, err := http.NewRequest("GET", fmt.Sprintf("%s/saml/idp/res", loginDetails.URL), nil)

	if err != nil {
		return "", errors.Wrap(err, "Error building SAML assertion request")
	}
	debugHTTPRequest(ac, req)
	// Don't urlencode query string - APM bug
	req.URL.RawQuery = fmt.Sprintf("id=%s", ac.policyID)
	res, err := ac.client.Do(req)
	if err != nil {
		return "", errors.Wrap(err, "Error retrieving SAML assertion request")
	}
	debugHTTPResponse(ac, res)
	samlData, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return "", errors.Wrap(err, "Error reading SAML assertion body")
	}
	var samlAssertion string
	doc, err := goquery.NewDocumentFromReader(bytes.NewBuffer(samlData))
	if err != nil {
		return "", errors.Wrap(err, "Error reading SAML data")
	}
	doc.Find("input").Each(func(i int, s *goquery.Selection) {
		name, ok := s.Attr("name")
		if !ok {
			logger.Fatalf("Unable to locate IDP authentication")
		}
		if name == "SAMLResponse" {
			val, ok := s.Attr("value")
			if !ok {
				logger.Fatalf("Unable to locate SAML assertion value")
			}
			samlAssertion = val
		}
	})
	return samlAssertion, nil
}