github.com/argoproj/argo-cd/v3@v3.2.1/cmd/argocd/commands/relogin.go (about)

     1  package commands
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  
     7  	"github.com/coreos/go-oidc/v3/oidc"
     8  	log "github.com/sirupsen/logrus"
     9  	"github.com/spf13/cobra"
    10  
    11  	"github.com/argoproj/argo-cd/v3/cmd/argocd/commands/headless"
    12  	argocdclient "github.com/argoproj/argo-cd/v3/pkg/apiclient"
    13  	settingspkg "github.com/argoproj/argo-cd/v3/pkg/apiclient/settings"
    14  	"github.com/argoproj/argo-cd/v3/util/errors"
    15  	utilio "github.com/argoproj/argo-cd/v3/util/io"
    16  	"github.com/argoproj/argo-cd/v3/util/localconfig"
    17  	"github.com/argoproj/argo-cd/v3/util/session"
    18  )
    19  
    20  // NewReloginCommand returns a new instance of `argocd relogin` command
    21  func NewReloginCommand(globalClientOpts *argocdclient.ClientOptions) *cobra.Command {
    22  	var (
    23  		password         string
    24  		callback         string
    25  		ssoPort          int
    26  		ssoLaunchBrowser bool
    27  	)
    28  	command := &cobra.Command{
    29  		Use:   "relogin",
    30  		Short: "Refresh an expired authenticate token",
    31  		Long:  "Refresh an expired authenticate token",
    32  		Run: func(c *cobra.Command, args []string) {
    33  			ctx := c.Context()
    34  
    35  			if len(args) != 0 {
    36  				c.HelpFunc()(c, args)
    37  				os.Exit(1)
    38  			}
    39  			localCfg, err := localconfig.ReadLocalConfig(globalClientOpts.ConfigPath)
    40  			errors.CheckError(err)
    41  			if localCfg == nil {
    42  				log.Fatalf("No context found. Login using `argocd login`")
    43  			}
    44  			configCtx, err := localCfg.ResolveContext(localCfg.CurrentContext)
    45  			errors.CheckError(err)
    46  
    47  			var tokenString string
    48  			var refreshToken string
    49  			clientOpts := argocdclient.ClientOptions{
    50  				ConfigPath:        "",
    51  				ServerAddr:        configCtx.Server.Server,
    52  				Insecure:          configCtx.Server.Insecure,
    53  				ClientCertFile:    globalClientOpts.ClientCertFile,
    54  				ClientCertKeyFile: globalClientOpts.ClientCertKeyFile,
    55  				GRPCWeb:           globalClientOpts.GRPCWeb,
    56  				GRPCWebRootPath:   globalClientOpts.GRPCWebRootPath,
    57  				PlainText:         configCtx.Server.PlainText,
    58  				Headers:           globalClientOpts.Headers,
    59  			}
    60  			acdClient := headless.NewClientOrDie(&clientOpts, c)
    61  			claims, err := configCtx.User.Claims()
    62  			errors.CheckError(err)
    63  			if claims.Issuer == session.SessionManagerClaimsIssuer {
    64  				fmt.Printf("Relogging in as '%s'\n", localconfig.GetUsername(claims.Subject))
    65  				tokenString = passwordLogin(ctx, acdClient, localconfig.GetUsername(claims.Subject), password)
    66  			} else {
    67  				fmt.Println("Reinitiating SSO login")
    68  				setConn, setIf := acdClient.NewSettingsClientOrDie()
    69  				defer utilio.Close(setConn)
    70  				httpClient, err := acdClient.HTTPClient()
    71  				errors.CheckError(err)
    72  				ctx = oidc.ClientContext(ctx, httpClient)
    73  				acdSet, err := setIf.Get(ctx, &settingspkg.SettingsQuery{})
    74  				errors.CheckError(err)
    75  				oauth2conf, provider, err := acdClient.OIDCConfig(ctx, acdSet)
    76  				errors.CheckError(err)
    77  				tokenString, refreshToken = oauth2Login(ctx, callback, ssoPort, acdSet.GetOIDCConfig(), oauth2conf, provider, ssoLaunchBrowser)
    78  			}
    79  
    80  			localCfg.UpsertUser(localconfig.User{
    81  				Name:         localCfg.CurrentContext,
    82  				AuthToken:    tokenString,
    83  				RefreshToken: refreshToken,
    84  			})
    85  			err = localconfig.WriteLocalConfig(*localCfg, globalClientOpts.ConfigPath)
    86  			errors.CheckError(err)
    87  			fmt.Printf("Context '%s' updated\n", localCfg.CurrentContext)
    88  		},
    89  		Example: `  
    90  # Reinitiates the login with previous contexts
    91  argocd relogin
    92  
    93  # Reinitiates the login with password
    94  argocd relogin --password YOUR_PASSWORD
    95  
    96  # Configure direct access using Kubernetes API server
    97  argocd login cd.argoproj.io --core
    98  
    99  # If user logged in with - "argocd login cd.argoproj.io" with sso login
   100  # The command - "argocd relogin" will Reinitiates SSO login and updates the server context`,
   101  	}
   102  	command.Flags().StringVar(&password, "password", "", "The password of an account to authenticate")
   103  	command.Flags().IntVar(&ssoPort, "sso-port", DefaultSSOLocalPort, "Port to run local OAuth2 login application")
   104  	command.Flags().StringVar(&callback, "callback", "", "Host and Port for the callback URL")
   105  	command.Flags().BoolVar(&ssoLaunchBrowser, "sso-launch-browser", true, "Automatically launch the default browser when performing SSO login")
   106  	return command
   107  }