@@ -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
2322type 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
9389func 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.
298293func (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