VAG: simplify token refresh handling (#9700)

This commit is contained in:
andig 2023-09-03 14:49:53 +02:00 • committed by GitHub
parent c3ceaab8f8
commit 5db7bf5cc3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 11 additions and 33 deletions

View file

@ -10,7 +10,7 @@ import (
"github.com/evcc-io/evcc/util/request"
"github.com/evcc-io/evcc/vehicle/seat"
"github.com/evcc-io/evcc/vehicle/seat/cupra"
"github.com/evcc-io/evcc/vehicle/vag/tokenrefreshservice"
"github.com/evcc-io/evcc/vehicle/vag/service"
"github.com/evcc-io/evcc/vehicle/vag/vwidentity"
"golang.org/x/oauth2"
)
@ -51,20 +51,11 @@ func NewCupraFromConfig(other map[string]interface{}) (api.Vehicle, error) {
log := util.NewLogger("cupra").Redact(cc.User, cc.Password, cc.VIN)
// get initial VW identity id_token
q, err := vwidentity.Login(log, seat.AuthParams, cc.User, cc.Password)
ts, err := service.TokenRefreshServiceTokenSource(log, seat.TRSParams, seat.AuthParams, cc.User, cc.Password)
if err != nil {
return nil, err
}
trs := tokenrefreshservice.New(log, seat.TRSParams)
token, err := trs.Exchange(q)
if err != nil {
return nil, err
}
ts := trs.TokenSource(token)
// get OIDC user information
ctx := context.WithValue(context.Background(), oauth2.HTTPClient, request.NewClient(log))
ui, err := vwidentity.Config.NewProvider(ctx).UserInfo(ctx, ts)

View file

@ -8,7 +8,6 @@ import (
"github.com/evcc-io/evcc/util/request"
"github.com/evcc-io/evcc/vehicle/seat"
"github.com/evcc-io/evcc/vehicle/vag/service"
"github.com/evcc-io/evcc/vehicle/vag/tokenrefreshservice"
"github.com/evcc-io/evcc/vehicle/vw"
)
@ -51,8 +50,7 @@ func NewSeatFromConfig(other map[string]interface{}) (api.Vehicle, error) {
log := util.NewLogger("seat").Redact(cc.User, cc.Password, cc.VIN)
trs := tokenrefreshservice.New(log, seat.TRSParams)
ts, err := service.MbbTokenSource(log, trs, seat.AuthClientID, seat.AuthParams, cc.User, cc.Password)
ts, err := service.MbbTokenSource(log, seat.TRSParams, seat.AuthClientID, seat.AuthParams, cc.User, cc.Password)
if err != nil {
return nil, err
}

View file

@ -8,7 +8,6 @@ import (
"github.com/evcc-io/evcc/util/request"
"github.com/evcc-io/evcc/vehicle/skoda"
"github.com/evcc-io/evcc/vehicle/vag/service"
"github.com/evcc-io/evcc/vehicle/vag/tokenrefreshservice"
"github.com/evcc-io/evcc/vehicle/vw"
)
@ -72,8 +71,7 @@ func NewSkodaFromConfig(other map[string]interface{}) (api.Vehicle, error) {
}
if err == nil {
trs := tokenrefreshservice.New(log, skoda.TRSParams)
ts, err := service.MbbTokenSource(log, trs, skoda.AuthClientID, skoda.AuthParams, cc.User, cc.Password)
ts, err := service.MbbTokenSource(log, skoda.TRSParams, skoda.AuthClientID, skoda.AuthParams, cc.User, cc.Password)
if err != nil {
return nil, err
}

View file

@ -6,28 +6,21 @@ import (
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/vehicle/vag"
"github.com/evcc-io/evcc/vehicle/vag/mbb"
"github.com/evcc-io/evcc/vehicle/vag/vwidentity"
)
// MbbTokenSource creates a refreshing token source for use with the MBB api.
// Once the MBB token expires, it is recreated from the token exchanger (either TokenRefreshService or IDK)
func MbbTokenSource(log *util.Logger, tox vag.TokenExchanger, clientID string, q url.Values, user, password string) (vag.TokenSource, error) {
q, err := vwidentity.Login(log, q, user, password)
func MbbTokenSource(log *util.Logger, toxValues url.Values, clientID string, q url.Values, user, password string) (vag.TokenSource, error) {
ts, err := TokenRefreshServiceTokenSource(log, toxValues, q, user, password)
if err != nil {
return nil, err
}
token, err := tox.Exchange(q)
if err != nil {
return nil, err
}
trs := tox.TokenSource(token)
mbb := mbb.New(log, clientID)
mts := vag.MetaTokenSource(func() (*vag.Token, error) {
// get TRS token from refreshing TRS token source
itoken, err := trs.TokenEx()
itoken, err := ts.TokenEx()
if err != nil {
return nil, err
}

View file

@ -4,18 +4,18 @@ import (
"net/url"
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/vehicle/vag"
"github.com/evcc-io/evcc/vehicle/vag/tokenrefreshservice"
"github.com/evcc-io/evcc/vehicle/vag/vwidentity"
"golang.org/x/oauth2"
)
func TokenRefreshServiceTokenSource(log *util.Logger, data, q url.Values, user, password string) (oauth2.TokenSource, error) {
func TokenRefreshServiceTokenSource(log *util.Logger, toxValues, q url.Values, user, password string) (vag.TokenSource, error) {
q, err := vwidentity.Login(log, q, user, password)
if err != nil {
return nil, err
}
trs := tokenrefreshservice.New(log, data)
trs := tokenrefreshservice.New(log, toxValues)
token, err := trs.Exchange(q)
if err != nil {
return nil, err

View file

@ -7,7 +7,6 @@ import (
"github.com/evcc-io/evcc/util"
"github.com/evcc-io/evcc/util/request"
"github.com/evcc-io/evcc/vehicle/vag/service"
"github.com/evcc-io/evcc/vehicle/vag/tokenrefreshservice"
"github.com/evcc-io/evcc/vehicle/vw"
)
@ -50,8 +49,7 @@ func NewVWFromConfig(other map[string]interface{}) (api.Vehicle, error) {
log := util.NewLogger("vw").Redact(cc.User, cc.Password, cc.VIN)
trs := tokenrefreshservice.New(log, vw.TRSParams)
ts, err := service.MbbTokenSource(log, trs, vw.AuthClientID, vw.AuthParams, cc.User, cc.Password)
ts, err := service.MbbTokenSource(log, vw.TRSParams, vw.AuthClientID, vw.AuthParams, cc.User, cc.Password)
if err != nil {
return nil, err
}