github.com/jfrog/jfrog-cli-core/v2@v2.51.0/artifactory/utils/weblogin.go (about)

     1  package utils
     2  
     3  import (
     4  	"errors"
     5  	"github.com/google/uuid"
     6  	"github.com/jfrog/jfrog-cli-core/v2/utils/config"
     7  	"github.com/jfrog/jfrog-client-go/auth"
     8  	clientUtils "github.com/jfrog/jfrog-client-go/utils"
     9  	"github.com/jfrog/jfrog-client-go/utils/errorutils"
    10  	"github.com/jfrog/jfrog-client-go/utils/log"
    11  	"github.com/pkg/browser"
    12  	"time"
    13  )
    14  
    15  func DoWebLogin(serverDetails *config.ServerDetails) (token auth.CommonTokenParams, err error) {
    16  	if err = sendUnauthenticatedPing(serverDetails); err != nil {
    17  		return
    18  	}
    19  
    20  	uuidToken, err := uuid.NewRandom()
    21  	if errorutils.CheckError(err) != nil {
    22  		return
    23  	}
    24  	uuidStr := uuidToken.String()
    25  	accessManager, err := CreateAccessServiceManager(serverDetails, false)
    26  	if err != nil {
    27  		return
    28  	}
    29  	if err = accessManager.SendLoginAuthenticationRequest(uuidStr); err != nil {
    30  		err = errors.Join(err,
    31  			errorutils.CheckErrorf("The 'Web Login' functionality is only supported for Artifactory version 7.64.0 and above. "+
    32  				"Make sure the details you entered are correct and that Artifactory meets the version requirement."))
    33  		return
    34  	}
    35  	log.Info("After logging in via your web browser, please enter the code if prompted: " + uuidStr[len(uuidStr)-4:])
    36  	if err = browser.OpenURL(clientUtils.AddTrailingSlashIfNeeded(serverDetails.Url) + "ui/login?jfClientSession=" + uuidStr + "&jfClientName=JFrog-CLI&jfClientCode=1"); err != nil {
    37  		return
    38  	}
    39  	time.Sleep(1 * time.Second)
    40  	log.Debug("Attempting to get the authentication token...")
    41  	token, err = accessManager.GetLoginAuthenticationToken(uuidStr)
    42  	if err != nil {
    43  		return
    44  	}
    45  	if token.AccessToken == "" {
    46  		return token, errorutils.CheckErrorf("failed getting authentication token after web log")
    47  	}
    48  	log.Info("You're now logged in!")
    49  	return
    50  }
    51  
    52  func sendUnauthenticatedPing(serverDetails *config.ServerDetails) error {
    53  	artifactoryManager, err := CreateServiceManager(serverDetails, 3, 0, false)
    54  	if err != nil {
    55  		return err
    56  	}
    57  	_, err = artifactoryManager.Ping()
    58  	return err
    59  }