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
+8 -5
View File
@@ -80,8 +80,9 @@ func getDynamicSecretList(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
@@ -197,7 +198,7 @@ func createDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
@@ -328,8 +329,9 @@ func renewDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
@@ -435,8 +437,9 @@ func revokeDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
@@ -541,7 +544,7 @@ func listDynamicSecretLeaseByName(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
+1 -1
View File
@@ -46,7 +46,7 @@ var initCmd = &cobra.Command{
} }
if userCreds.LoginExpired { if userCreds.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") userCreds = util.EstablishUserLoginSession()
} }
httpClient, err := util.GetRestyClientWithCustomHeaders() httpClient, err := util.GetRestyClientWithCustomHeaders()
+2 -2
View File
@@ -237,7 +237,7 @@ var secretsSetCmd = &cobra.Command{
} }
if loggedInUserDetails.LoginExpired { 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{ secretOperations, err = util.SetRawSecrets(processedArgs, secretType, environmentName, secretsPath, projectId, &models.TokenDetails{
@@ -325,7 +325,7 @@ var secretsDeleteCmd = &cobra.Command{
} }
if loggedInUserDetails.LoginExpired { 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) httpClient.SetAuthToken(loggedInUserDetails.UserCredentials.JTWToken)
+4 -4
View File
@@ -184,7 +184,7 @@ func issueCredentials(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
@@ -417,7 +417,7 @@ func signKey(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
@@ -626,7 +626,7 @@ func sshConnect(cmd *cobra.Command, args []string) {
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
@@ -879,7 +879,7 @@ func sshAddHost(cmd *cobra.Command, args []string) {
util.HandleError(err, "Unable to authenticate") util.HandleError(err, "Unable to authenticate")
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login]") loggedInUserDetails = util.EstablishUserLoginSession()
} }
infisicalToken = loggedInUserDetails.UserCredentials.JTWToken infisicalToken = loggedInUserDetails.UserCredentials.JTWToken
} }
+1 -1
View File
@@ -47,7 +47,7 @@ var tokensCreateCmd = &cobra.Command{
} }
if loggedInUserDetails.LoginExpired { 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") tokenOnly, err := cmd.Flags().GetBool("token-only")
+2 -1
View File
@@ -111,8 +111,9 @@ var userGetTokenCmd = &cobra.Command{
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails(true) loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails(true)
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = util.EstablishUserLoginSession()
} }
if err != nil { if err != nil {
util.HandleError(err, "[infisical user get token]: Unable to get logged in user token") util.HandleError(err, "[infisical user get token]: Unable to get logged in user token")
} }
+41
View File
@@ -1,5 +1,13 @@
package util package util
import (
"fmt"
"os"
"os/exec"
"github.com/rs/zerolog/log"
)
type AuthStrategyType string type AuthStrategyType string
var AuthStrategy = struct { var AuthStrategy = struct {
@@ -43,3 +51,36 @@ func IsAuthMethodValid(authMethod string, allowUserAuth bool) (isValid bool, str
} }
return false, "" 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
}
+3 -3
View File
@@ -25,7 +25,7 @@ func GetAllFolders(params models.GetAllFoldersParameters) ([]models.SingleFolder
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = EstablishUserLoginSession()
} }
workspaceFile, err := GetWorkSpaceFromFile() workspaceFile, err := GetWorkSpaceFromFile()
@@ -194,7 +194,7 @@ func CreateFolder(params models.CreateFolderParameters) (models.SingleFolder, er
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = EstablishUserLoginSession()
} }
params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken
@@ -244,7 +244,7 @@ func DeleteFolder(params models.DeleteFolderParameters) ([]models.SingleFolder,
} }
if loggedInUserDetails.LoginExpired { if loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = EstablishUserLoginSession()
} }
params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken params.InfisicalToken = loggedInUserDetails.UserCredentials.JTWToken
+1 -1
View File
@@ -174,7 +174,7 @@ func RequireLogin() {
configFile, _ := GetConfigFile() configFile, _ := GetConfigFile()
if configFile.LoggedInUserEmail == "" { if configFile.LoggedInUserEmail == "" {
PrintErrorMessageAndExit("You must be logged in to run this command. To login, run [infisical login]") EstablishUserLoginSession()
} }
} }
+1 -1
View File
@@ -273,7 +273,7 @@ func GetAllEnvironmentVariables(params models.GetAllSecretsParameters, projectCo
} }
if isConnected && loggedInUserDetails.LoginExpired { if isConnected && loggedInUserDetails.LoginExpired {
PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") loggedInUserDetails = EstablishUserLoginSession()
} }
var infisicalDotJson models.WorkspaceConfigFile var infisicalDotJson models.WorkspaceConfigFile