Fix re-login when token expired

* if it's a sudo re-login the user
* if not and if the toekn expired, re-login

Signed-off-by: Djordje Lukic <djordje.lukic@docker.com>
This commit is contained in:
Djordje Lukic 2020-11-23 14:50:17 +01:00
Родитель 06a23b6d7b
Коммит acb01a290e
2 изменённых файлов: 12 добавлений и 30 удалений

Просмотреть файл

@ -75,32 +75,22 @@ func NewRootCmd(streams command.Streams, hubClient *hub.Client, store credential
return err
}
if cmd.Annotations["sudo"] == "true" && ac.Username != "" {
return requireTwoFactorCode(cmd.Context(), streams, hubClient, store)
}
if ac.Username == "" {
log.Fatal(ansi.Error(`You need to be logged in to Docker Hub to use this tool.
Please login to Docker Hub using the "hub-tool login" command.`))
}
if !ac.TokenExpired() {
if cmd.Annotations["sudo"] == "true" {
if err := tryLogin(cmd.Context(), streams, hubClient, ac, store); err != nil {
return err
}
return nil
}
token, refreshToken, err := hubClient.Login(ac.Username, ac.Password, func() (string, error) {
return "", nil
})
if err != nil {
return err
if ac.TokenExpired() {
return tryLogin(cmd.Context(), streams, hubClient, ac, store)
}
return store.Store(credentials.Auth{
Username: ac.Username,
Password: ac.Password,
Token: token,
RefreshToken: refreshToken,
})
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
if flags.showVersion {
@ -149,16 +139,8 @@ func newVersionCmd(streams command.Streams) *cobra.Command {
}
}
func requireTwoFactorCode(ctx context.Context, streams command.Streams, hubClient *hub.Client, store credentials.Store) error {
ac, err := store.GetAuth()
if err != nil {
return err
}
if !ac.TokenExpired() {
return nil
}
token, refreshToken, err := login.VerifyTwoFactorCode(ctx, streams, hubClient, ac.Username, ac.Password)
func tryLogin(ctx context.Context, streams command.Streams, hubClient *hub.Client, ac *credentials.Auth, store credentials.Store) error {
token, refreshToken, err := login.Login(ctx, streams, hubClient, ac.Username, ac.Password)
if err != nil {
return err
}

Просмотреть файл

@ -49,7 +49,7 @@ func RunLogin(ctx context.Context, streams command.Streams, hubClient *hub.Clien
return err
}
token, refreshToken, err := VerifyTwoFactorCode(ctx, streams, hubClient, username, password)
token, refreshToken, err := Login(ctx, streams, hubClient, username, password)
if err != nil {
return err
}
@ -66,8 +66,8 @@ func RunLogin(ctx context.Context, streams command.Streams, hubClient *hub.Clien
})
}
// VerifyTwoFactorCode run 2FA login
func VerifyTwoFactorCode(ctx context.Context, streams command.Streams, hubClient *hub.Client, username string, password string) (string, string, error) {
// Login runs login and optionnaly the 2FA
func Login(ctx context.Context, streams command.Streams, hubClient *hub.Client, username string, password string) (string, string, error) {
return hubClient.Login(username, password, func() (string, error) {
return readClearText(ctx, streams, "2FA required, please provide the 6 digit code: ")
})