Skip to content

Commit

Permalink
Easee: reauthenticate when refresh fails (evcc-io#9720)
Browse files Browse the repository at this point in the history
  • Loading branch information
GrimmiMeloni authored Sep 5, 2023
1 parent 19872a9 commit d7ca1fc
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 26 deletions.
13 changes: 0 additions & 13 deletions charger/easee.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,22 +181,9 @@ func NewEasee(user, password, charger string, timeout time.Duration) (*Easee, er
err = os.ErrDeadlineExceeded
}

if err == nil {
go c.refresh()
}

return c, err
}

// refresh ensures tokens are refreshed even when not charging for longer time
func (c *Easee) refresh() {
for range time.Tick(5 * time.Minute) {
if _, err := c.Client.Transport.(*oauth2.Transport).Source.Token(); err != nil {
c.log.ERROR.Println("token refresh:", err)
}
}
}

func (c *Easee) chargerSite(charger string) (easee.Site, error) {
var res easee.Site
uri := fmt.Sprintf("%s/chargers/%s/site", easee.API, charger)
Expand Down
33 changes: 20 additions & 13 deletions charger/easee/identity.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,20 +35,29 @@ func (t *Token) AsOAuth2Token() *oauth2.Token {
// tokenSource is an oauth2.TokenSource
type tokenSource struct {
*request.Helper
user, password string
}

// TokenSource creates an Easee token source
func TokenSource(log *util.Logger, user, password string) (oauth2.TokenSource, error) {
c := &tokenSource{
Helper: request.NewHelper(log),
Helper: request.NewHelper(log),
user: user,
password: password,
}

token, err := c.authenticate()

return oauth.RefreshTokenSource(token.AsOAuth2Token(), c), err
}

func (c *tokenSource) authenticate() (*Token, error) {
data := struct {
Username string `json:"userName"`
Password string `json:"password"`
}{
Username: user,
Password: password,
Username: c.user,
Password: c.password,
}

uri := fmt.Sprintf("%s/%s", API, "accounts/login")
Expand All @@ -58,14 +67,9 @@ func TokenSource(log *util.Logger, user, password string) (oauth2.TokenSource, e
}

var token Token
if err := c.DoJSON(req, &token); err != nil {
return nil, err
}

oauthToken := token.AsOAuth2Token()
ts := oauth2.ReuseTokenSourceWithExpiry(oauthToken, oauth.RefreshTokenSource(oauthToken, c), 15*time.Minute)
err = c.DoJSON(req, &token)

return ts, nil
return &token, err
}

func (c *tokenSource) RefreshToken(oauthToken *oauth2.Token) (*oauth2.Token, error) {
Expand All @@ -80,12 +84,15 @@ func (c *tokenSource) RefreshToken(oauthToken *oauth2.Token) (*oauth2.Token, err
uri := fmt.Sprintf("%s/%s", API, "accounts/refresh_token")
req, err := request.New(http.MethodPost, uri, request.MarshalJSON(data), request.JSONEncoding)
if err != nil {
return oauthToken, err
return nil, err
}

var token Token
var token *Token
if err := c.DoJSON(req, &token); err != nil {
return oauthToken, err
// re-login
if token, err = c.authenticate(); err != nil {
return nil, err
}
}

return token.AsOAuth2Token(), nil
Expand Down

0 comments on commit d7ca1fc

Please sign in to comment.