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
}