in pkg/provider/okta/okta.go [167:232]
func (oc *Client) follow(ctx context.Context, req *http.Request, loginDetails *creds.LoginDetails) (string, error) {
res, err := oc.client.Do(req)
if err != nil {
return "", errors.Wrap(err, "error following")
}
doc, err := goquery.NewDocumentFromResponse(res)
if err != nil {
return "", errors.Wrap(err, "failed to build document from response")
}
var handler func(context.Context, *goquery.Document) (context.Context, *http.Request, error)
if docIsFormRedirectToAlibabaCloud(doc) {
logger.WithField("type", "saml-response").Debug("doc detect")
if samlResponse, ok := extractSAMLResponse(doc); ok {
decodedSamlResponse, err := base64.StdEncoding.DecodeString(samlResponse)
if err != nil {
return "", errors.Wrap(err, "failed to decode saml-response")
}
logger.WithField("type", "saml-response").WithField("saml-response", string(decodedSamlResponse)).Debug("doc detect")
return samlResponse, nil
}
} else if docIsFormSamlRequest(doc) {
logger.WithField("type", "saml-request").Debug("doc detect")
handler = oc.handleFormRedirect
} else if docIsFormResume(doc) {
logger.WithField("type", "resume").Debug("doc detect")
handler = oc.handleFormRedirect
} else if docIsFormSamlResponse(doc) {
logger.WithField("type", "saml-response").Debug("doc detect")
handler = oc.handleFormRedirect
} else {
req, err = http.NewRequest("GET", loginDetails.URL, nil)
if err != nil {
return "", errors.Wrap(err, "error building app request")
}
res, err = oc.client.Do(req)
if err != nil {
return "", errors.Wrap(err, "error retrieving app response")
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", errors.Wrap(err, "error retrieving body from response")
}
stateToken, err := getStateTokenFromOktaPageBody(string(body))
if err != nil {
return "", errors.Wrap(err, "error retrieving saml response")
}
loginDetails.StateToken = stateToken
return oc.Authenticate(loginDetails)
}
if handler == nil {
html, _ := doc.Selection.Html()
logger.WithField("doc", html).Debug("Unknown document type")
return "", fmt.Errorf("Unknown document type")
}
ctx, req, err = handler(ctx, doc)
if err != nil {
return "", err
}
return oc.follow(ctx, req, loginDetails)
}