diff --git a/internal/cli/get_token.go b/internal/cli/get_token.go deleted file mode 100644 index 11ed04da5..000000000 --- a/internal/cli/get_token.go +++ /dev/null @@ -1,91 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func getTokenCmd(cli *cli) *cobra.Command { - var clientID string - var audience string - var scopes []string - - cmd := &cobra.Command{ - Use: "get-token", - Short: "Fetch a token for the given client and API", - Long: `auth0 get-token -Fetch an access token for the given client and API. -`, - RunE: func(cmd *cobra.Command, args []string) error { - tenant, err := cli.getTenant() - if err != nil { - return err - } - - // use the client ID as passed in by the user, or default to the - // "CLI Login Testing" client if none passed. This client is only - // used for testing login from the CLI and will be created if it - // does not exist. - if clientID == "" { - client, err := getOrCreateCLITesterClient(cli.api.Client) - if err != nil { - return err - } - clientID = client.GetClientID() - } - - client, err := cli.api.Client.Read(clientID) - if err != nil { - return err - } - - appType := client.GetAppType() - - cli.renderer.Infof("Domain: " + tenant.Domain) - cli.renderer.Infof("ClientID: " + clientID) - cli.renderer.Infof("Type: " + appType + "\n") - - // We can check here if the client is an m2m client, and if so - // initiate the client credentials flow instead to fetch a token, - // avoiding the browser and HTTP server shenanigans altogether. - if appType == "non_interactive" { - tokenResponse, err := runClientCredentialsFlow(cli, client, clientID, audience, tenant) - if err != nil { - return err - } - - fmt.Fprint(cli.renderer.MessageWriter, "\n") - cli.renderer.GetToken(client, tokenResponse) - return nil - } - - if proceed := runLoginFlowPreflightChecks(cli, client); !proceed { - return nil - } - - tokenResponse, err := runLoginFlow( - cli, - tenant, - client, - "", // specifying a connection is only supported for try-login - audience, - "", // We don't want to force a prompt for get-token - scopes, - ) - if err != nil { - return err - } - - fmt.Fprint(cli.renderer.MessageWriter, "\n") - cli.renderer.GetToken(client, tokenResponse) - return nil - }, - } - - cmd.SetUsageTemplate(resourceUsageTemplate()) - cmd.Flags().StringVarP(&clientID, "client-id", "c", "", "Client ID for which to fetch a token.") - cmd.Flags().StringVarP(&audience, "audience", "a", "", "The unique identifier of the target API you want to access.") - cmd.Flags().StringSliceVarP(&scopes, "scope", "s", []string{}, "Client ID for which to test login.") - return cmd -} diff --git a/internal/cli/root.go b/internal/cli/root.go index d98ab1bb8..61ecf8863 100644 --- a/internal/cli/root.go +++ b/internal/cli/root.go @@ -29,7 +29,7 @@ func Execute() { PersistentPreRunE: func(cmd *cobra.Command, args []string) error { // If the user is trying to login, no need to go // through setup. - if cmd.Use == "login" { + if cmd.Use == "login" && cmd.Parent().Use == "auth0" { return nil } @@ -62,10 +62,9 @@ func Execute() { rootCmd.AddCommand(quickstartCmd(cli)) rootCmd.AddCommand(appsCmd(cli)) rootCmd.AddCommand(apisCmd(cli)) - rootCmd.AddCommand(tryLoginCmd(cli)) + rootCmd.AddCommand(testCmd(cli)) rootCmd.AddCommand(logsCmd(cli)) rootCmd.AddCommand(actionsCmd(cli)) - rootCmd.AddCommand(getTokenCmd(cli)) // keep completion at the bottom: rootCmd.AddCommand(completionCmd(cli)) diff --git a/internal/cli/test.go b/internal/cli/test.go new file mode 100644 index 000000000..53d8e425d --- /dev/null +++ b/internal/cli/test.go @@ -0,0 +1,179 @@ +package cli + +import ( + "fmt" + + "github.com/auth0/auth0-cli/internal/ansi" + "github.com/auth0/auth0-cli/internal/auth/authutil" + "github.com/spf13/cobra" +) + +func testCmd(cli *cli) *cobra.Command { + cmd := &cobra.Command{ + Use: "test", + Short: "Try your universal login box or get a token", + } + + cmd.SetUsageTemplate(resourceUsageTemplate()) + cmd.AddCommand(testTokenCmd(cli)) + cmd.AddCommand(testLoginCmd(cli)) + + return cmd +} + +func testLoginCmd(cli *cli) *cobra.Command { + var clientID string + var connectionName string + + cmd := &cobra.Command{ + Use: "login", + Short: "Try out your universal login box", + Long: `auth0 test login +Launch a browser to try out your universal login box for the given client. +`, + RunE: func(cmd *cobra.Command, args []string) error { + var userInfo *authutil.UserInfo + + tenant, err := cli.getTenant() + if err != nil { + return err + } + + // use the client ID as passed in by the user, or default to the + // "CLI Login Testing" client if none passed. This client is only + // used for testing login from the CLI and will be created if it + // does not exist. + if clientID == "" { + client, err := getOrCreateCLITesterClient(cli.api.Client) + if err != nil { + return err + } + clientID = client.GetClientID() + } + + client, err := cli.api.Client.Read(clientID) + if err != nil { + return err + } + + if proceed := runLoginFlowPreflightChecks(cli, client); !proceed { + return nil + } + + tokenResponse, err := runLoginFlow( + cli, + tenant, + client, + connectionName, + "", // audience is only supported for the test token command + "login", // force a login page when using the test login command + cliLoginTestingScopes, + ) + if err != nil { + return err + } + + if err := ansi.Spinner("Fetching user metadata", func() error { + // Use the access token to fetch user information from the /userinfo + // endpoint. + userInfo, err = authutil.FetchUserInfo(tenant.Domain, tokenResponse.AccessToken) + return err + }); err != nil { + return err + } + + fmt.Fprint(cli.renderer.MessageWriter, "\n") + cli.renderer.TryLogin(userInfo, tokenResponse) + return nil + }, + } + + cmd.SetUsageTemplate(resourceUsageTemplate()) + cmd.Flags().StringVarP(&clientID, "client-id", "c", "", "Client Id for which to test login.") + cmd.Flags().StringVarP(&connectionName, "connection", "", "", "Connection to test during login.") + return cmd +} + +func testTokenCmd(cli *cli) *cobra.Command { + var clientID string + var audience string + var scopes []string + + cmd := &cobra.Command{ + Use: "token", + Short: "Fetch a token for the given client and API", + Long: `auth0 test token +Fetch an access token for the given client and API. +`, + RunE: func(cmd *cobra.Command, args []string) error { + tenant, err := cli.getTenant() + if err != nil { + return err + } + + // use the client ID as passed in by the user, or default to the + // "CLI Login Testing" client if none passed. This client is only + // used for testing login from the CLI and will be created if it + // does not exist. + if clientID == "" { + client, err := getOrCreateCLITesterClient(cli.api.Client) + if err != nil { + return err + } + clientID = client.GetClientID() + } + + client, err := cli.api.Client.Read(clientID) + if err != nil { + return err + } + + appType := client.GetAppType() + + cli.renderer.Infof("Domain: " + tenant.Domain) + cli.renderer.Infof("ClientID: " + clientID) + cli.renderer.Infof("Type: " + appType + "\n") + + // We can check here if the client is an m2m client, and if so + // initiate the client credentials flow instead to fetch a token, + // avoiding the browser and HTTP server shenanigans altogether. + if appType == "non_interactive" { + tokenResponse, err := runClientCredentialsFlow(cli, client, clientID, audience, tenant) + if err != nil { + return err + } + + fmt.Fprint(cli.renderer.MessageWriter, "\n") + cli.renderer.GetToken(client, tokenResponse) + return nil + } + + if proceed := runLoginFlowPreflightChecks(cli, client); !proceed { + return nil + } + + tokenResponse, err := runLoginFlow( + cli, + tenant, + client, + "", // specifying a connection is only supported for the test login command + audience, + "", // We don't want to force a prompt for the test token command + scopes, + ) + if err != nil { + return err + } + + fmt.Fprint(cli.renderer.MessageWriter, "\n") + cli.renderer.GetToken(client, tokenResponse) + return nil + }, + } + + cmd.SetUsageTemplate(resourceUsageTemplate()) + cmd.Flags().StringVarP(&clientID, "client-id", "c", "", "Client ID for which to fetch a token.") + cmd.Flags().StringVarP(&audience, "audience", "a", "", "The unique identifier of the target API you want to access.") + cmd.Flags().StringSliceVarP(&scopes, "scope", "s", []string{}, "Client ID for which to test login.") + return cmd +} diff --git a/internal/cli/try_login.go b/internal/cli/try_login.go deleted file mode 100644 index 27bd2401a..000000000 --- a/internal/cli/try_login.go +++ /dev/null @@ -1,82 +0,0 @@ -package cli - -import ( - "fmt" - - "github.com/auth0/auth0-cli/internal/ansi" - "github.com/auth0/auth0-cli/internal/auth/authutil" - "github.com/spf13/cobra" -) - -func tryLoginCmd(cli *cli) *cobra.Command { - var clientID string - var connectionName string - - cmd := &cobra.Command{ - Use: "try-login", - Short: "Try out your universal login box", - Long: `auth0 try-login -Launch a browser to try out your universal login box for the given client. -`, - RunE: func(cmd *cobra.Command, args []string) error { - var userInfo *authutil.UserInfo - - tenant, err := cli.getTenant() - if err != nil { - return err - } - - // use the client ID as passed in by the user, or default to the - // "CLI Login Testing" client if none passed. This client is only - // used for testing login from the CLI and will be created if it - // does not exist. - if clientID == "" { - client, err := getOrCreateCLITesterClient(cli.api.Client) - if err != nil { - return err - } - clientID = client.GetClientID() - } - - client, err := cli.api.Client.Read(clientID) - if err != nil { - return err - } - - if proceed := runLoginFlowPreflightChecks(cli, client); !proceed { - return nil - } - - tokenResponse, err := runLoginFlow( - cli, - tenant, - client, - connectionName, - "", // audience is only supported for get-token - "login", // force a login page when using try-login - cliLoginTestingScopes, - ) - if err != nil { - return err - } - - if err := ansi.Spinner("Fetching user metadata", func() error { - // Use the access token to fetch user information from the /userinfo - // endpoint. - userInfo, err = authutil.FetchUserInfo(tenant.Domain, tokenResponse.AccessToken) - return err - }); err != nil { - return err - } - - fmt.Fprint(cli.renderer.MessageWriter, "\n") - cli.renderer.TryLogin(userInfo, tokenResponse) - return nil - }, - } - - cmd.SetUsageTemplate(resourceUsageTemplate()) - cmd.Flags().StringVarP(&clientID, "client-id", "c", "", "Client Id for which to test login.") - cmd.Flags().StringVarP(&connectionName, "connection", "", "", "Connection to test during login.") - return cmd -}