edent / BMW-i-Remote

A reverse engineered interface for the BMW i3 Electric Car
MIT License
390 stars 60 forks source link

API Server authentication issues #52

Open rs38 opened 4 years ago

rs38 commented 4 years ago

needs to be done via https://customer.bmwgroup.com/gcdm/oauth/authenticate

please see

23

rs38 commented 4 years ago

https://github.com/bimmerconnected/bimmer_connected/pull/151

havrla commented 4 years ago

resolv: auth.txt

havrla commented 3 years ago
BASE_URL = 'customer.bmwgroup.com'
#BASE_URL = 'b2vapi.bmwgroup.com'

def getToken(BASE_URL, username, password, timeout=(20, 20)):
    try:
        headers = {
                "Content-Type": "application/x-www-form-urlencoded",
                "Content-Length": "124",
                "Connection": "Keep-Alive",
                "Host": BASE_URL,
                "Accept-Encoding": "gzip",
                "Authorization": "Basic blF2NkNxdHhKdVhXUDc0eGYzQ0p3VUVQOjF6REh4NnVuNGNEanli"
                                 "TEVOTjNreWZ1bVgya0VZaWdXUGNRcGR2RFJwSUJrN3JPSg==",
                "Credentials": "nQv6CqtxJuXWP74xf3CJwUEP:1zDHx6un4cDjybLENN3kyfumX2kEYigWPcQpdvDRpIBk7rOJ",
                "User-Agent": "okhttp/2.60"}

        data = {
            'client_id': 'dbf0a542-ebd1-4ff0-a9a7-55172fbfce35',
            'response_type': 'token',
            'redirect_uri': 'https://www.bmw-connecteddrive.com/app/static/external-dispatch.html',
            'scope': 'authenticate_user vehicle_data remote_services',
            'username': username,
            'password': password}

        data = urllib.parse.urlencode(data)#       url = 'https://' + BASE_URL + '/webapi/oauth/token'
#        url = 'https://' + BASE_URL + '/webapi/oauth/token'
        url = 'https://' + BASE_URL + '/gcdm/oauth/authenticate'
        #print (url)
        r = requests.post(url, data=data, headers=headers, allow_redirects=False)
        #print (r)
        if r.status_code == 302:
            logging.info('Access token acquired')
            response_json = dict(
                    urllib.parse.parse_qsl(urllib.parse.urlparse(r.headers['Location']).fragment)
                )
            #print(response_json)
            #print(response_json['access_token'])
            return response_json['access_token']
        else:
            raise ValueError('Unable to login')

    except Exception as msg:
        logging.error(msg)
rs38 commented 3 years ago

I am also experiencing problems, but they also have some issues on the web login right now. I'm not able to login here: https://www.bmw-connecteddrive.de/app/index.html#/portal

rs38 commented 3 years ago

it turns out that my root cause issue since last weekend is that they need TLS 1.2 enabled. Not sure how python deals with it, with .NET webclient it's ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;