Merge pull request #3704 from Infisical/feat/add-auto-login-for-bad-sessions-1

feat: add auto-login support for CLI for bad user session
This commit is contained in:
Sheen
2025-06-03 17:25:02 +08:00
committed by GitHub
10 changed files with 69 additions and 24 deletions

View File

@@ -80,8 +80,9 @@ func getDynamicSecretList(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -197,7 +198,7 @@ func createDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -328,8 +329,9 @@ func renewDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -435,8 +437,9 @@ func revokeDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -541,7 +544,7 @@ func listDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}

View File

@@ -46,7 +46,7 @@ var initCmd = &cobra.Command{
}
if userCreds.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
userCreds = util.EstablishUserLoginSession()
}
httpClient, err := util.GetRestyClientWithCustomHeaders()

View File

@@ -237,7 +237,7 @@ var secretsSetCmd = &cobra.Command{
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
secretOperations, err = util.SetRawSecrets(processedArgs, secretType, environmentName, secretsPath, projectId, &models.TokenDetails{
@@ -325,7 +325,7 @@ var secretsDeleteCmd = &cobra.Command{
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
httpClient.SetAuthToken(loggedInUserDetails.UserCredentials.JTWToken)

View File

@@ -184,7 +184,7 @@ func issueCredentials(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -417,7 +417,7 @@ func signKey(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -612,7 +612,7 @@ func sshConnect(cmd *cobra.Command, args []string) {
if err != nil {
util.HandleError(err, "Unable to parse flag")
}
var infisicalToken string
if token != nil && (token.Type == util.SERVICE_TOKEN_IDENTIFIER || token.Type == util.UNIVERSAL_AUTH_TOKEN_IDENTIFIER) {
@@ -626,7 +626,7 @@ func sshConnect(cmd *cobra.Command, args []string) {
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -640,7 +640,7 @@ func sshConnect(cmd *cobra.Command, args []string) {
if err != nil {
util.HandleError(err, "Unable to parse flag")
}
hostname, _ := cmd.Flags().GetString("hostname")
loginUser, _ := cmd.Flags().GetString("login-user")
@@ -858,7 +858,7 @@ func sshConnect(cmd *cobra.Command, args []string) {
err = sshCmd.Run()
if err != nil {
util.HandleError(err, "SSH connection failed")
}
}
}
func sshAddHost(cmd *cobra.Command, args []string) {
@@ -879,7 +879,7 @@ func sshAddHost(cmd *cobra.Command, args []string) {
util.HandleError(err, "Unable to authenticate")
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login]")
loggedInUserDetails = util.EstablishUserLoginSession()
}
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
}
@@ -904,7 +904,7 @@ func sshAddHost(cmd *cobra.Command, args []string) {
if err != nil {
util.HandleError(err, "Unable to parse --alias flag")
}
// if alias == "" {
// util.PrintErrorMessageAndExit("You must provide --alias")
// }
@@ -937,7 +937,7 @@ func sshAddHost(cmd *cobra.Command, args []string) {
if configureSshd && (!writeUserCaToFile || !writeHostCertToFile) {
util.PrintErrorMessageAndExit("--configure-sshd requires both --write-user-ca-to-file and --write-host-cert-to-file to also be set")
}
// Pre-check for file overwrites before proceeding
if writeUserCaToFile {
if strings.HasPrefix(userCaOutFilePath, "~") {

View File

@@ -47,7 +47,7 @@ var tokensCreateCmd = &cobra.Command{
}
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
tokenOnly, err := cmd.Flags().GetBool("token-only")

View File

@@ -111,8 +111,9 @@ var userGetTokenCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) {
loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails(true)
if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = util.EstablishUserLoginSession()
}
if err != nil {
util.HandleError(err, "[infisical user get token]: Unable to get logged in user token")
}

View File

@@ -1,5 +1,13 @@
package util
import (
"fmt"
"os"
"os/exec"
"github.com/rs/zerolog/log"
)
type AuthStrategyType string
var AuthStrategy = struct {
@@ -43,3 +51,36 @@ func IsAuthMethodValid(authMethod string, allowUserAuth bool) (isValid bool, str
}
return false, ""
}
// EstablishUserLoginSession handles the login flow to either create a new session or restore an expired one.
// It returns fresh user details if login is successful.
func EstablishUserLoginSession() LoggedInUserDetails {
log.Info().Msg("No valid login session found, triggering login flow")
exePath, err := os.Executable()
if err != nil {
PrintErrorMessageAndExit(fmt.Sprintf("Failed to determine executable path: %v", err))
}
// Spawn infisical login command
loginCmd := exec.Command(exePath, "login", "--silent")
loginCmd.Stdin = os.Stdin
loginCmd.Stdout = os.Stdout
loginCmd.Stderr = os.Stderr
err = loginCmd.Run()
if err != nil {
PrintErrorMessageAndExit(fmt.Sprintf("Failed to automatically trigger login flow. Please run [infisical login] manually to login."))
}
loggedInUserDetails, err := GetCurrentLoggedInUserDetails(true)
if err != nil {
PrintErrorMessageAndExit("You must be logged in to run this command. To login, run [infisical login]")
}
if loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired. Please run [infisical login]")
}
return loggedInUserDetails
}

View File

@@ -25,7 +25,7 @@ func GetAllFolders(params models.GetAllFoldersParameters) ([]models.SingleFolder
}
if loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = EstablishUserLoginSession()
}
workspaceFile, err := GetWorkSpaceFromFile()
@@ -194,7 +194,7 @@ func CreateFolder(params models.CreateFolderParameters) (models.SingleFolder, er
}
if loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = EstablishUserLoginSession()
}
params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken
@@ -244,7 +244,7 @@ func DeleteFolder(params models.DeleteFolderParameters) ([]models.SingleFolder,
}
if loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = EstablishUserLoginSession()
}
params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken

View File

@@ -174,7 +174,7 @@ func RequireLogin() {
configFile, _ := GetConfigFile()
if configFile.LoggedInUserEmail == "" {
PrintErrorMessageAndExit("You must be logged in to run this command. To login, run [infisical login]")
EstablishUserLoginSession()
}
}

View File

@@ -273,7 +273,7 @@ func GetAllEnvironmentVariables(params models.GetAllSecretsParameters, projectCo
}
if isConnected && loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again")
loggedInUserDetails = EstablishUserLoginSession()
}
var infisicalDotJson models.WorkspaceConfigFile