diff --git a/cli/packages/api/model.go b/cli/packages/api/model.go index adf7a814d3..bc63218729 100644 --- a/cli/packages/api/model.go +++ b/cli/packages/api/model.go @@ -138,6 +138,7 @@ type GetOrganizationsResponse struct { type SelectOrganizationResponse struct { Token string `json:"token"` MfaEnabled bool `json:"isMfaEnabled"` + MfaMethod string `json:"mfaMethod"` } type SelectOrganizationRequest struct { @@ -260,8 +261,9 @@ type GetLoginTwoV2Response struct { } type VerifyMfaTokenRequest struct { - Email string `json:"email"` - MFAToken string `json:"mfaToken"` + Email string `json:"email"` + MFAToken string `json:"mfaToken"` + MFAMethod string `json:"mfaMethod"` } type VerifyMfaTokenResponse struct { diff --git a/cli/packages/cmd/init.go b/cli/packages/cmd/init.go index f95d904857..05655e97cd 100644 --- a/cli/packages/cmd/init.go +++ b/cli/packages/cmd/init.go @@ -79,13 +79,14 @@ var initCmd = &cobra.Command{ if tokenResponse.MfaEnabled { i := 1 for i < 6 { - mfaVerifyCode := askForMFACode() - + mfaVerifyCode := askForMFACode(tokenResponse.MfaMethod) + httpClient := resty.New() httpClient.SetAuthToken(tokenResponse.Token) verifyMFAresponse, mfaErrorResponse, requestError := api.CallVerifyMfaToken(httpClient, api.VerifyMfaTokenRequest{ - Email: userCreds.UserCredentials.Email, - MFAToken: mfaVerifyCode, + Email: userCreds.UserCredentials.Email, + MFAToken: mfaVerifyCode, + MFAMethod: tokenResponse.MfaMethod, }) if requestError != nil { util.HandleError(err) @@ -99,7 +100,7 @@ var initCmd = &cobra.Command{ break } } - + if mfaErrorResponse.Context.Code == "mfa_expired" { util.PrintErrorMessageAndExit("Your 2FA verification code has expired, please try logging in again") break diff --git a/cli/packages/cmd/login.go b/cli/packages/cmd/login.go index 03974ba19e..649b5b01ce 100644 --- a/cli/packages/cmd/login.go +++ b/cli/packages/cmd/login.go @@ -343,7 +343,7 @@ func cliDefaultLogin(userCredentialsToBeStored *models.UserCredentials) { if loginTwoResponse.MfaEnabled { i := 1 for i < 6 { - mfaVerifyCode := askForMFACode() + mfaVerifyCode := askForMFACode("email") httpClient := resty.New() httpClient.SetAuthToken(loginTwoResponse.Token) @@ -756,13 +756,14 @@ func GetJwtTokenWithOrganizationId(oldJwtToken string, email string) string { if selectedOrgRes.MfaEnabled { i := 1 for i < 6 { - mfaVerifyCode := askForMFACode() + mfaVerifyCode := askForMFACode(selectedOrgRes.MfaMethod) httpClient := resty.New() httpClient.SetAuthToken(selectedOrgRes.Token) verifyMFAresponse, mfaErrorResponse, requestError := api.CallVerifyMfaToken(httpClient, api.VerifyMfaTokenRequest{ - Email: email, - MFAToken: mfaVerifyCode, + Email: email, + MFAToken: mfaVerifyCode, + MFAMethod: selectedOrgRes.MfaMethod, }) if requestError != nil { util.HandleError(err) @@ -817,9 +818,15 @@ func generateFromPassword(password string, salt []byte, p *params) (hash []byte, return hash, nil } -func askForMFACode() string { +func askForMFACode(mfaMethod string) string { + var label string + if mfaMethod == "totp" { + label = "Enter the verification code from your mobile authenticator app or use a recovery code" + } else { + label = "Enter the 2FA verification code sent to your email" + } mfaCodePromptUI := promptui.Prompt{ - Label: "Enter the 2FA verification code sent to your email", + Label: label, } mfaVerifyCode, err := mfaCodePromptUI.Run()