66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package aiways
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/hex"
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/evcc-io/evcc/util"
|
|
"github.com/evcc-io/evcc/util/request"
|
|
)
|
|
|
|
type Identity struct {
|
|
*request.Helper
|
|
user, hash, token string
|
|
}
|
|
|
|
type TokenProvider interface {
|
|
Token() string
|
|
}
|
|
|
|
// NewIdentity creates BMW identity
|
|
func NewIdentity(log *util.Logger) *Identity {
|
|
v := &Identity{
|
|
Helper: request.NewHelper(log),
|
|
}
|
|
|
|
return v
|
|
}
|
|
|
|
func (v *Identity) Login(user, password string) (int64, error) {
|
|
hash := md5.Sum([]byte(password))
|
|
v.hash = hex.EncodeToString(hash[:])
|
|
v.user = user
|
|
|
|
var res User
|
|
|
|
data := struct {
|
|
Account string `json:"account"`
|
|
Password string `json:"password"`
|
|
}{
|
|
Account: v.user,
|
|
Password: v.hash,
|
|
}
|
|
|
|
uri := fmt.Sprintf("%s/aiways-passport-service/passport/login/password", URI)
|
|
req, err := request.New(http.MethodPost, uri, request.MarshalJSON(data), request.JSONEncoding)
|
|
|
|
if err == nil {
|
|
if err = v.DoJSON(req, &res); err == nil && res.Data == nil {
|
|
err = errors.New(res.Message)
|
|
}
|
|
|
|
if err == nil {
|
|
v.token = res.Data.Token
|
|
return res.Data.UserID, nil
|
|
}
|
|
}
|
|
|
|
return 0, err
|
|
}
|
|
|
|
func (v *Identity) Token() string {
|
|
return v.token
|
|
}
|