From ce5364346db50db5cd80d189d0df6554308276dc Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 2 May 2022 15:26:18 +0200 Subject: [PATCH] Nissan: use OAuth2 for code exchange and token refresh (#3302) --- vehicle/nissan/identity.go | 53 ++++++++++++-------------------------- 1 file changed, 17 insertions(+), 36 deletions(-) diff --git a/vehicle/nissan/identity.go b/vehicle/nissan/identity.go index 30b37a82f..dd940e793 100644 --- a/vehicle/nissan/identity.go +++ b/vehicle/nissan/identity.go @@ -1,6 +1,7 @@ package nissan import ( + "context" "fmt" "net/http" "net/url" @@ -8,7 +9,6 @@ import ( "github.com/evcc-io/evcc/api" "github.com/evcc-io/evcc/util" - "github.com/evcc-io/evcc/util/oauth" "github.com/evcc-io/evcc/util/request" "golang.org/x/oauth2" ) @@ -115,45 +115,26 @@ func (v *Identity) Login(user, password string) error { } } - var token oauth.Token - if err == nil { - data := url.Values{ - "code": {code}, - "client_id": {ClientID}, - "client_secret": {ClientSecret}, - "redirect_uri": {RedirectURI}, - "grant_type": {"authorization_code"}, - } - - uri = fmt.Sprintf("%s/oauth2/%s/access_token?%s", AuthURL, realm, data.Encode()) - req, err = request.New(http.MethodPost, uri, nil, request.URLEncoding) - if err == nil { - err = v.DoJSON(req, &token) - } + uri = fmt.Sprintf("%s/oauth2/%s/access_token", AuthURL, realm) + config := oauth2.Config{ + ClientID: ClientID, + ClientSecret: ClientSecret, + RedirectURL: RedirectURI, + Endpoint: oauth2.Endpoint{ + AuthURL: uri, + TokenURL: uri, + AuthStyle: oauth2.AuthStyleInParams, + }, } + ctx := context.WithValue(context.Background(), oauth2.HTTPClient, v.Client) + + var token *oauth2.Token if err == nil { - v.TokenSource = oauth.RefreshTokenSource((*oauth2.Token)(&token), v) + token, err = config.Exchange(ctx, code) } + v.TokenSource = config.TokenSource(ctx, token) + return err } - -func (v *Identity) RefreshToken(token *oauth2.Token) (*oauth2.Token, error) { - data := url.Values{ - "client_id": {ClientID}, - "client_secret": {ClientSecret}, - "grant_type": {"refresh_token"}, - "refresh_token": {token.RefreshToken}, - } - - uri := fmt.Sprintf("%s/oauth2/%s/access_token?%s", AuthURL, Realm, data.Encode()) - req, err := request.New(http.MethodPost, uri, nil, request.URLEncoding) - - var res oauth.Token - if err == nil { - err = v.DoJSON(req, &res) - } - - return (*oauth2.Token)(&res), err -}