@@ -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
4653func 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