Skip to content

Commit 5bf73ed

Browse files
authored
[auth] Fix failed session refresh (#2350)
1 parent bb67992 commit 5bf73ed

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

internal/boxcli/auth.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,15 @@ func whoAmICmd() *cobra.Command {
9696
if err != nil {
9797
return err
9898
}
99-
return box.UninitializedSecrets(cmd.Context()).
99+
// TODO: WhoAmI should be a function in opensource/pkg/auth that takes in a session.
100+
// That way we don't need to handle failed refresh token errors here.
101+
err = box.UninitializedSecrets(cmd.Context()).
100102
WhoAmI(cmd.Context(), cmd.OutOrStdout(), flags.showTokens)
103+
if identity.IsRefreshTokenError(err) {
104+
ux.Fwarningf(cmd.ErrOrStderr(), "Your session is expired. Please login again.\n")
105+
return loginCmd().RunE(cmd, args)
106+
}
107+
return err
101108
},
102109
}
103110

internal/devbox/providers/identity/identity.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ import (
55
"errors"
66
"os"
77
"path"
8+
"strings"
89

910
"github.com/go-jose/go-jose/v4"
1011
"github.com/go-jose/go-jose/v4/jwt"
1112
"go.jetify.com/typeid"
1213
"go.jetpack.io/devbox/internal/build"
14+
"go.jetpack.io/devbox/internal/ux"
1315
"go.jetpack.io/pkg/api"
1416
"go.jetpack.io/pkg/auth"
1517
"go.jetpack.io/pkg/auth/session"
@@ -40,7 +42,12 @@ func GenSession(ctx context.Context) (*session.Token, error) {
4042
if err != nil {
4143
return nil, err
4244
}
43-
return c.GetSession(ctx)
45+
tok, err := c.GetSession(ctx)
46+
if IsRefreshTokenError(err) {
47+
ux.Fwarningf(os.Stderr, "Your session is expired. Please login again.\n")
48+
return c.LoginFlow()
49+
}
50+
return tok, err
4451
}
4552

4653
func Peek() (*session.Token, error) {
@@ -129,3 +136,13 @@ func GetOrgSlug(ctx context.Context) (string, error) {
129136

130137
return claims["org_trusted_metadata"].(map[string]any)["slug"].(string), nil
131138
}
139+
140+
// invalid_grant or invalid_request usually means the refresh token is expired, revoked, or
141+
// malformed. this belongs in opensource/pkg/auth
142+
func IsRefreshTokenError(err error) bool {
143+
if err == nil {
144+
return false
145+
}
146+
return strings.Contains(err.Error(), "invalid_grant") ||
147+
strings.Contains(err.Error(), "invalid_request")
148+
}

0 commit comments

Comments
 (0)