in pkg/provider/browser/browser.go [53:128]
func (cl *Client) Authenticate(loginDetails *creds.LoginDetails) (string, error) {
runOptions := playwright.RunOptions{}
if cl.BrowserDriverDir != "" {
runOptions.DriverDirectory = cl.BrowserDriverDir
}
// Optionally download browser drivers
if loginDetails.DownloadBrowser {
err := playwright.Install(&runOptions)
if err != nil {
return "", err
}
}
pw, err := playwright.Run(&runOptions)
if err != nil {
return "", err
}
// TODO: provide some overrides for this window
launchOptions := playwright.BrowserTypeLaunchOptions{
Headless: playwright.Bool(cl.Headless),
}
validBrowserTypes := []string{"chromium", "firefox", "webkit", "chrome", "chrome-beta", "chrome-dev", "chrome-canary", "msedge", "msedge-beta", "msedge-dev", "msedge-canary"}
if len(cl.BrowserType) > 0 && !contains(validBrowserTypes, cl.BrowserType) {
return "", fmt.Errorf("invalid browser-type: '%s', only %s are allowed", cl.BrowserType, validBrowserTypes)
}
if cl.BrowserType != "" {
logger.Info(fmt.Sprintf("Setting browser type: %s", cl.BrowserType))
launchOptions.Channel = playwright.String(cl.BrowserType)
}
// Default browser is Chromium as it is widely supported for Identity providers,
// It can also be set to the other playwright browsers: Firefox and WebKit
browserType := pw.Chromium
if cl.BrowserType == "firefox" {
browserType = pw.Firefox
} else if cl.BrowserType == "webkit" {
browserType = pw.WebKit
}
// You can set the path to a browser executable to run instead of the playwright-go bundled one. If `executablePath`
// is a relative path, then it is resolved relative to the current working directory.
// Note that Playwright only works with the bundled Chromium, Firefox or WebKit, use at your own risk. see:
if len(cl.BrowserExecutablePath) > 0 {
logger.Info(fmt.Sprintf("Setting browser executable path: %s", cl.BrowserExecutablePath))
launchOptions.ExecutablePath = &cl.BrowserExecutablePath
}
// currently using the main browsers supported by Playwright: Chromium, Firefox or Webkit
//
// this is a sandboxed browser window so password managers and addons are separate
browser, err := browserType.Launch(launchOptions)
if err != nil {
return "", err
}
page, err := browser.NewPage()
if err != nil {
return "", err
}
defer func() {
logger.Info("clean up browser")
if err := browser.Close(); err != nil {
logger.Info("Error when closing browser", err)
}
if err := pw.Stop(); err != nil {
logger.Info("Error when stopping pm", err)
}
}()
return getSAMLResponse(page, loginDetails, cl)
}