From 46569c73acdbf80df307bda89721351dfa38d11e Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 3 Jul 2023 17:05:27 +0200 Subject: [PATCH] Easee: refresh token within access token validity time (#8783) --- charger/easee.go | 10 +++++----- charger/easee/identity.go | 2 +- util/oauth/tokensource.go | 25 ++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/charger/easee.go b/charger/easee.go index e0a766b68..23e9dc3cb 100644 --- a/charger/easee.go +++ b/charger/easee.go @@ -178,17 +178,17 @@ func NewEasee(user, password, charger string, timeout time.Duration) (*Easee, er } if err == nil { - go c.heartbeat() + go c.keepalive() } return c, err } -// heartbeat ensures tokens are refreshed even when not charging for longer time -func (c *Easee) heartbeat() { - for range time.Tick(6 * time.Hour) { +// keepalive ensures tokens are refreshed even when not charging for longer time +func (c *Easee) keepalive() { + for range time.Tick(time.Hour) { if _, err := c.chargerSite(c.charger); err != nil { - c.log.ERROR.Println("heartbeat:", err) + c.log.ERROR.Println("keep alive:", err) } } } diff --git a/charger/easee/identity.go b/charger/easee/identity.go index aebbb3173..e0860daa7 100644 --- a/charger/easee/identity.go +++ b/charger/easee/identity.go @@ -58,7 +58,7 @@ func TokenSource(log *util.Logger, user, password string) (oauth2.TokenSource, e if err == nil { var token Token if err = c.DoJSON(req, &token); err == nil { - c.TokenSource = oauth.RefreshTokenSource(token.AsOAuth2Token(), c) + c.TokenSource = oauth.RefreshTokenSource(token.AsOAuth2Token(), c, oauth.WithExpiryMargin(6*time.Hour)) } } diff --git a/util/oauth/tokensource.go b/util/oauth/tokensource.go index f996a0c76..664e84c33 100644 --- a/util/oauth/tokensource.go +++ b/util/oauth/tokensource.go @@ -17,17 +17,36 @@ type TokenSource struct { mu sync.Mutex token *oauth2.Token refresher TokenRefresher + margin time.Duration } -func RefreshTokenSource(token *oauth2.Token, refresher TokenRefresher) oauth2.TokenSource { - return &TokenSource{token: token, refresher: refresher} +type TokenSourceOption func(*TokenSource) + +func WithExpiryMargin(margin time.Duration) TokenSourceOption { + return func(ts *TokenSource) { + ts.margin = margin + } +} + +func RefreshTokenSource(token *oauth2.Token, refresher TokenRefresher, opt ...TokenSourceOption) oauth2.TokenSource { + ts := &TokenSource{ + token: token, + refresher: refresher, + margin: time.Minute, + } + + for _, o := range opt { + o(ts) + } + + return ts } func (ts *TokenSource) Token() (*oauth2.Token, error) { ts.mu.Lock() defer ts.mu.Unlock() var err error - if ts.token == nil || time.Until(ts.token.Expiry) < time.Minute { + if ts.token == nil || time.Until(ts.token.Expiry) < ts.margin { var token *oauth2.Token if token, err = ts.refresher.RefreshToken(ts.token); err == nil { if token.AccessToken == "" {