package easee import ( "fmt" "net/http" "time" "github.com/evcc-io/evcc/util" "github.com/evcc-io/evcc/util/oauth" "github.com/evcc-io/evcc/util/request" "golang.org/x/oauth2" ) // Token is the Easee Token type Token struct { AccessToken string `json:"accessToken"` ExpiresIn float32 `json:"expiresIn"` TokenType string `json:"tokenType"` RefreshToken string `json:"refreshToken"` } func (t *Token) AsOAuth2Token() *oauth2.Token { if t == nil { return nil } return &oauth2.Token{ AccessToken: t.AccessToken, TokenType: t.TokenType, RefreshToken: t.RefreshToken, Expiry: time.Now().Add(time.Second * time.Duration(t.ExpiresIn)), } } // 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), 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: c.user, Password: c.password, } uri := fmt.Sprintf("%s/%s", API, "accounts/login") req, err := request.New(http.MethodPost, uri, request.MarshalJSON(data), request.JSONEncoding) if err != nil { return nil, err } var token Token err = c.DoJSON(req, &token) return &token, err } func (c *tokenSource) RefreshToken(oauthToken *oauth2.Token) (*oauth2.Token, error) { data := struct { AccessToken string `json:"accessToken"` RefreshToken string `json:"refreshToken"` }{ AccessToken: oauthToken.AccessToken, RefreshToken: oauthToken.RefreshToken, } 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 nil, err } var token *Token if err := c.DoJSON(req, &token); err != nil { // re-login if token, err = c.authenticate(); err != nil { return nil, err } } return token.AsOAuth2Token(), nil }