@@ -5,11 +5,13 @@ import (
5
5
"errors"
6
6
"os"
7
7
"path"
8
+ "strings"
8
9
9
10
"github.com/go-jose/go-jose/v4"
10
11
"github.com/go-jose/go-jose/v4/jwt"
11
12
"go.jetify.com/typeid"
12
13
"go.jetpack.io/devbox/internal/build"
14
+ "go.jetpack.io/devbox/internal/ux"
13
15
"go.jetpack.io/pkg/api"
14
16
"go.jetpack.io/pkg/auth"
15
17
"go.jetpack.io/pkg/auth/session"
@@ -40,7 +42,12 @@ func GenSession(ctx context.Context) (*session.Token, error) {
40
42
if err != nil {
41
43
return nil , err
42
44
}
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
44
51
}
45
52
46
53
func Peek () (* session.Token , error ) {
@@ -129,3 +136,13 @@ func GetOrgSlug(ctx context.Context) (string, error) {
129
136
130
137
return claims ["org_trusted_metadata" ].(map [string ]any )["slug" ].(string ), nil
131
138
}
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