Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions cli/azd/cmd/auth_login.go
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,34 @@ func newLoginAction(
}

func (la *loginAction) Run(ctx context.Context) (*actions.ActionResult, error) {
loginMode, err := la.authManager.Mode()
if err != nil {
return nil, err
}
if loginMode != auth.AzdBuiltIn {
la.console.MessageUxItem(ctx, &ux.WarningAltMessage{
Message: fmt.Sprintf(
"Azd is not using the built-in authentication mode, but rather '%s'", loginMode),
})
la.console.Message(ctx, "If you want to use 'azd auth login', you need to disable the current auth mode.")
Comment on lines +296 to +300
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This removes the use for azd auth login --check-status to verify azd is logged in using az.

response, err := la.console.Confirm(ctx, input.ConsoleOptions{
Message: "Do you want to switch back to azd built-in authentication?",
DefaultValue: false,
Help: "Azd supports multiple authentication modes, including Azure CLI authentication and External " +
"request for Auth. Switching back to azd built-in authentication will try to disable the current mode.",
})
if err != nil {
return nil, err
}
if !response {
return nil, fmt.Errorf("log in is not supported on current mode: %s", loginMode)
}
if err := la.authManager.SetBuiltInAuthMode(); err != nil {
return nil, fmt.Errorf("setting auth mode: %w", err)
}
la.console.Message(ctx, "Authentication mode set to azd built-in. Continuing login...")
}

if len(la.flags.scopes) == 0 {
la.flags.scopes = la.authManager.LoginScopes()
}
Expand Down
64 changes: 64 additions & 0 deletions cli/azd/pkg/auth/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -1409,3 +1409,67 @@ func (m *Manager) LogInDetails(ctx context.Context) (*LogInDetails, error) {

return nil, ErrNoCurrentUser
}

type AuthMode string

const (
AzdBuiltIn AuthMode = "azd built in"
AzDelegated AuthMode = "delegated to az cli"
ExternalRequest AuthMode = "external token request"
)

func (m *Manager) Mode() (AuthMode, error) {
// Check external
if m.UseExternalAuth() {
return ExternalRequest, nil
}

// check az delegation
cfg, err := m.userConfigManager.Load()
if err != nil {
return "", fmt.Errorf("fetching current user: %w", err)
}

if shouldUseLegacyAuth(cfg) {
return AzDelegated, nil
}

// default to azd
return AzdBuiltIn, nil
}

func (m *Manager) SetBuiltInAuthMode() error {
currentMode, err := m.Mode()
if err != nil {
return fmt.Errorf("fetching current auth mode: %w", err)
}
if currentMode == AzdBuiltIn {
return nil
}

if currentMode == ExternalRequest {
return fmt.Errorf("cannot change auth mode when external token mode is set. See %s",
"https://github.com/Azure/azure-dev/blob/main/cli/azd/docs/external-authentication.md")
}

// protecting against unexpected modes. There should be only azDelegated left.
if currentMode != AzDelegated {
return fmt.Errorf("Unexpected mode found: %s", currentMode)
}

// Unset the useAzCliAuthKey flag
cfg, err := m.userConfigManager.Load()
if err != nil {
return fmt.Errorf("reading user config: %w", err)
}

if err := cfg.Unset(useAzCliAuthKey); err != nil {
return fmt.Errorf("unsetting %s: %w", useAzCliAuthKey, err)
}

if err := m.userConfigManager.Save(cfg); err != nil {
return fmt.Errorf("saving user config: %w", err)
}

return nil
}
Loading