Skip to content

Commit 27b2edf

Browse files
authored
Cardata: fix id token not refreshed (#24196)
1 parent 34968a8 commit 27b2edf

File tree

1 file changed

+24
-32
lines changed

1 file changed

+24
-32
lines changed

plugin/auth/oauth.go

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,15 @@ import (
1515
"github.com/evcc-io/evcc/server/db/settings"
1616
"github.com/evcc-io/evcc/server/providerauth"
1717
"github.com/evcc-io/evcc/util"
18-
"github.com/evcc-io/evcc/util/oauth"
1918
"github.com/evcc-io/evcc/util/request"
2019
"golang.org/x/oauth2"
2120
)
2221

2322
type OAuth struct {
24-
oauth2.TokenSource
2523
mu sync.Mutex
2624
log *util.Logger
2725
oc *oauth2.Config
26+
token *oauth2.Token
2827
subject string
2928
cv string
3029
ctx context.Context
@@ -85,10 +84,7 @@ func NewOauthFromConfig(ctx context.Context, other map[string]any) (oauth2.Token
8584
return NewOauth(ctx, cc.Name, &cc.Config)
8685
}
8786

88-
var (
89-
_ oauth.TokenRefresher = (*OAuth)(nil)
90-
_ api.AuthProvider = (*OAuth)(nil)
91-
)
87+
var _ api.AuthProvider = (*OAuth)(nil)
9288

9389
func NewOauth(ctx context.Context, name string, oc *oauth2.Config, opts ...oauthOption) (oauth2.TokenSource, error) {
9490
if name == "" {
@@ -146,7 +142,9 @@ func NewOauth(ctx context.Context, name string, oc *oauth2.Config, opts ...oauth
146142
}
147143
}
148144

149-
o.TokenSource = oauth.RefreshTokenSource(&token, o)
145+
if token.RefreshToken != "" {
146+
o.token = &token
147+
}
150148

151149
// register auth redirect
152150
onlineC, err := providerauth.Register(subject, o)
@@ -163,17 +161,22 @@ func NewOauth(ctx context.Context, name string, oc *oauth2.Config, opts ...oauth
163161
return o, nil
164162
}
165163

166-
// RefreshToken implements oauth.TokenRefresher.
167-
func (o *OAuth) RefreshToken(token *oauth2.Token) (*oauth2.Token, error) {
168-
if token.RefreshToken == "" {
164+
// Token
165+
func (o *OAuth) Token() (*oauth2.Token, error) {
166+
o.mu.Lock()
167+
defer o.mu.Unlock()
168+
169+
if o.token == nil {
169170
return nil, api.ErrMissingToken
170171
}
171172

172-
o.log.DEBUG.Printf("refreshing token for %s", o.subject)
173+
if o.token.Valid() {
174+
return o.token, nil
175+
}
173176

174-
// refresh token source
175-
token, err := o.oc.TokenSource(o.ctx, token).Token()
177+
token, err := o.oc.TokenSource(o.ctx, o.token).Token()
176178
if err != nil {
179+
// force logout
177180
if strings.Contains(err.Error(), "invalid_grant") && settings.Exists(o.subject) {
178181
o.onlineC <- false
179182
settings.Delete(o.subject)
@@ -182,33 +185,25 @@ func (o *OAuth) RefreshToken(token *oauth2.Token) (*oauth2.Token, error) {
182185
return nil, err
183186
}
184187

185-
err = o.updateToken(token)
188+
o.updateToken(token)
186189

187-
o.onlineC <- token.Valid()
188-
189-
return token, err
190+
return token, nil
190191
}
191192

192193
// updateToken must only be called when lock is held
193-
func (o *OAuth) updateToken(token *oauth2.Token) error {
194+
func (o *OAuth) updateToken(token *oauth2.Token) {
194195
var store any = token
195196

196197
// tokenStorer allows persisting the token together with it's extra properties
197198
if o.tokenStorer != nil {
198199
store = o.tokenStorer(token)
199200
}
200201

201-
return settings.SetJson(o.subject, store)
202-
}
203-
204-
// updateTokenSource must only be called when lock is held
205-
func (o *OAuth) updateTokenSource(token *oauth2.Token) {
206-
if err := o.updateToken(token); err != nil {
202+
if err := settings.SetJson(o.subject, store); err != nil {
207203
o.log.ERROR.Printf("error saving token: %v", err)
208-
return
209204
}
210205

211-
o.TokenSource = oauth.RefreshTokenSource(token, o)
206+
o.token = token
212207

213208
o.onlineC <- token.Valid()
214209
}
@@ -225,7 +220,7 @@ func (o *OAuth) HandleCallback(params url.Values) error {
225220
return err
226221
}
227222

228-
o.updateTokenSource(token)
223+
o.updateToken(token)
229224

230225
return nil
231226
}
@@ -256,7 +251,7 @@ func (o *OAuth) Login(state string) (string, error) {
256251
o.mu.Lock()
257252
defer o.mu.Unlock()
258253

259-
o.updateTokenSource(token)
254+
o.updateToken(token)
260255
}()
261256

262257
return da.VerificationURIComplete, nil
@@ -282,7 +277,7 @@ func (o *OAuth) Logout() error {
282277
o.mu.Lock()
283278
defer o.mu.Unlock()
284279

285-
o.TokenSource = oauth.RefreshTokenSource(nil, o)
280+
o.token = nil
286281

287282
o.onlineC <- false
288283

@@ -296,9 +291,6 @@ func (o *OAuth) DisplayName() string {
296291

297292
// Authenticated implements api.AuthProvider.
298293
func (o *OAuth) Authenticated() bool {
299-
o.mu.Lock()
300-
defer o.mu.Unlock()
301-
302294
token, err := o.Token()
303295
return err == nil && token.Valid()
304296
}

0 commit comments

Comments
 (0)