Giter Site home page Giter Site logo

1.70 Tests about fordpass-ha HOT 60 OPEN

SquidBytes avatar SquidBytes commented on July 21, 2024
1.70 Tests

from fordpass-ha.

Comments (60)

tobox avatar tobox commented on July 21, 2024 1

I just tested 1.70 in Germany.

The page did not load properly when I selected Europe/UK.

Then, I tried North Ameriaca an everything worked properly, except that all text messages appeared in dutch language!

But the integration seems to be OK now.

from fordpass-ha.

KrickGregory avatar KrickGregory commented on July 21, 2024 1

If I try with my European login I get a link for the token that won't load in Chrome if I set it to European. But if in ha I put it to USA I get a link that loads but then I get the error user not known in dev tools.

This is what I get if I set Europe in ha with 1.7
The resource https://prodb2cuicontentdelivery-d0bbevfjaxfmedda.z01.azurefd.net/b2cui/assets/fonts/FordAntenna-Regular.woff2 was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate as value and it is preloaded intentionally.

This is what I get if I set it to USA in ha.
Failed to launch 'fordapp://userauthorized/?error=server_error&error_description=AADB2C90002%3a+The+CORS+resource+%27https%3a%2f%2fprodb2cuicontentdelivery-d0bbevfjaxfmedda.z01.azurefd.net%2fb2cui%2fui%2fford%2fEN-IE%2funified.html%3fver%3d20240111.4%26SessionId%3d7d1c65c0-f71b-4021-bb67-16c59041f857%26InstanceId%3dc990bb7a-51f4-439b-bd36-9c07fb1041c0%27+returned+a+404+not+found.%0d%0aCorrelation+ID%3a+7d1c65c0-f71b-4021-bb67-16c59041f857%0d%0aTimestamp%3a+2024-06-04+17%3a42%3a40Z%0d%0a' because the scheme does not have a registered handler.

I'm not an IT guy so just tried for what I know and wanted to Share so it maybe can help.

Thanks for your efforts. Great work.

from fordpass-ha.

TerrorSource avatar TerrorSource commented on July 21, 2024

i've made a PR for version 1.70 to let the plugin create an URL for NL users.

#510

from fordpass-ha.

Giancky79 avatar Giancky79 commented on July 21, 2024

Hi, i'm try to change only part from const.py

REGIONS = {
    "UK&Europe": {
        "region": "1E8C7794-FF5F-49BC-9596-A1E0C86C5B19",
        "locale": "it-IT",
        "locale_short": "ITA", #Temp fix 
        "locale_url": "https://login.ford.it" <-- from app ford open with .com

worked for now , i'm try to open a PR

from fordpass-ha.

seebaer1976 avatar seebaer1976 commented on July 21, 2024

hi,
which of these two id's is the region id

login.ford.de/4566605f-43a7-400a-946e-89cc9fdb0bd7 or
ford_application_id=260ea066-aa5e-4344-995d-b8a3d7dd0fca
client_id=89f879a5-4474-413f-a090-46649584706d
scope=89f879a5-4474-413f-a090-46649584706d

this is the whole link when I log in normally at ford:
https://login.ford.de/4566605f-43a7-400a-946e-89cc9fdb0bd7/B2C_1A_SignInSignUp_de-DE/oauth2/v2.0/authorize?redirect_uri=https%3A%2F%2Fwww.ford.de%2Fmein-ford-account%2F&response_type=code&state=%7B%22policy%22%3A%22email_susi_policy%22%2C%22lang%22%3A%22de_de%22%2C%22state%22%3A%22YWNjb3VudC1kYXNoYm9hcmQ%3D%22%2C%22queryHash%22%3A%22%22%2C%22existingPath%22%3A%22%22%2C%22forwardUrl%22%3A%22%22%7D&client_id=89f879a5-4474-413f-a090-46649584706d&scope=89f879a5-4474-413f-a090-46649584706d%20openid&code_challenge=x_LFTcurVp6rmskPdcaIIiFLY4nIpYOj_MMNpU92lmY&code_challenge_method=S256&ui_locales=de-DE&template_id=Ford-MFA-Authentication&ford_application_id=260ea066-aa5e-4344-995d-b8a3d7dd0fca&country_code=DEU&language_code=de-DE

If it is neither of these, how can I find out the region ID?

Regions in const.py

REGION_OPTIONS = ["UK&Europe", "Australia", "North America & Canada", "Germany"]

and

REGIONS = {
    "Germany": {
        "region": "????????????",
        "locale": "de-DE",
        "locale_short": "DEU", #Temp fix 
        "locale_url": "https://login.ford.de"
    },

in fordpass_new.py :

region_lookup = {
"Germany": "?????????",

and

elif self.region2 == "Germany":
countryheader = "DEU"

would like to try the German login because it is very slow and does not always respond

from fordpass-ha.

creedda avatar creedda commented on July 21, 2024

Hello! In the US here and tried to follow the instructions but getting a "unknown error occurred" when I enter in my token from the developer tools in my browser.

2024-06-02 11:39:30.512 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
resp = await request_handler(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle
resp = await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 210, in forwarded_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/site-packages/aiohttp_session/__init__.py", line 199, in factory
response = await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 295, in auth_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware
response = await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
result = await handler(request, **request.match_info)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 71, in with_admin
return await func(self, request, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 222, in post
return await super().post(request, flow_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 73, in wrapper
return await method(view, request, data, *args, **kwargs)
File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 122, in post
result = await self._flow_mgr.async_configure(flow_id, data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 368, in async_configure
result = await self._async_configure(flow_id, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 414, in _async_configure
result = await self._async_handle_step(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 518, in _async_handle_step
result: _FlowResultT = await getattr(flow, method)(user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/fordpass/config_flow.py", line 171, in async_step_token
info = await validate_token(self.hass, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/fordpass/config_flow.py", line 64, in validate_token
results = await hass.async_add_executor_job(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/fordpass/fordpass_new.py", line 116, in generate_tokens
return self.generate_fulltokens(req.json())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/config/custom_components/fordpass/fordpass_new.py", line 119, in generate_fulltokens
data = {"idpToken": token["access_token"]}
~~~~~^^^^^^^^^^^^^^^^
KeyError: 'access_token'


Maybe something in the token not being expected is causing the error? DM me if you want me to share anything more confidential.

Or of course if there is anything I can retry let me know.

from fordpass-ha.

itchannel avatar itchannel commented on July 21, 2024

Hello! In the US here and tried to follow the instructions but getting a "unknown error occurred" when I enter in my token from the developer tools in my browser.


2024-06-02 11:39:30.512 ERROR (MainThread) [aiohttp.server] Error handling request

Traceback (most recent call last):

File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request

resp = await request_handler(request)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle

resp = await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl

return await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware

return await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 210, in forwarded_middleware

return await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware

return await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware

return await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/local/lib/python3.12/site-packages/aiohttp_session/__init__.py", line 199, in factory

response = await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 295, in auth_middleware

return await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware

response = await handler(request)

^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle

result = await handler(request, **request.match_info)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 71, in with_admin

return await func(self, request, *args, **kwargs)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 222, in post

return await super().post(request, flow_id)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 73, in wrapper

return await method(view, request, data, *args, **kwargs)

File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 122, in post

result = await self._flow_mgr.async_configure(flow_id, data)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 368, in async_configure

result = await self._async_configure(flow_id, user_input)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 414, in _async_configure

result = await self._async_handle_step(

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 518, in _async_handle_step

result: _FlowResultT = await getattr(flow, method)(user_input)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/config/custom_components/fordpass/config_flow.py", line 171, in async_step_token

info = await validate_token(self.hass, user_input)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/config/custom_components/fordpass/config_flow.py", line 64, in validate_token

results = await hass.async_add_executor_job(

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run

result = self.fn(*self.args, **self.kwargs)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/config/custom_components/fordpass/fordpass_new.py", line 116, in generate_tokens

return self.generate_fulltokens(req.json())

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/config/custom_components/fordpass/fordpass_new.py", line 119, in generate_fulltokens

data = {"idpToken": token["access_token"]}

~~~~~^^^^^^^^^^^^^^^^

KeyError: 'access_token'





Maybe something in the token not being expected is causing the error? DM me if you want me to share anything more confidential.

Or of course if there is anything I can retry let me know.

Can I confirm the token you are entering into the box starts with fordpass://

from fordpass-ha.

itchannel avatar itchannel commented on July 21, 2024

hi,

which of these two id's is the region id

login.ford.de/4566605f-43a7-400a-946e-89cc9fdb0bd7 or

ford_application_id=260ea066-aa5e-4344-995d-b8a3d7dd0fca

client_id=89f879a5-4474-413f-a090-46649584706d

scope=89f879a5-4474-413f-a090-46649584706d

this is the whole link when I log in normally at ford:

https://login.ford.de/4566605f-43a7-400a-946e-89cc9fdb0bd7/B2C_1A_SignInSignUp_de-DE/oauth2/v2.0/authorize?redirect_uri=https%3A%2F%2Fwww.ford.de%2Fmein-ford-account%2F&response_type=code&state=%7B%22policy%22%3A%22email_susi_policy%22%2C%22lang%22%3A%22de_de%22%2C%22state%22%3A%22YWNjb3VudC1kYXNoYm9hcmQ%3D%22%2C%22queryHash%22%3A%22%22%2C%22existingPath%22%3A%22%22%2C%22forwardUrl%22%3A%22%22%7D&client_id=89f879a5-4474-413f-a090-46649584706d&scope=89f879a5-4474-413f-a090-46649584706d%20openid&code_challenge=x_LFTcurVp6rmskPdcaIIiFLY4nIpYOj_MMNpU92lmY&code_challenge_method=S256&ui_locales=de-DE&template_id=Ford-MFA-Authentication&ford_application_id=260ea066-aa5e-4344-995d-b8a3d7dd0fca&country_code=DEU&language_code=de-DE

If it is neither of these, how can I find out the region ID?

Regions in const.py


REGION_OPTIONS = ["UK&Europe", "Australia", "North America & Canada", "Germany"]



and



REGIONS = {

    "Germany": {

        "region": "????????????",

        "locale": "de-DE",

        "locale_short": "DEU", #Temp fix 

        "locale_url": "https://login.ford.de"

    },

in fordpass_new.py :


region_lookup = {

"Germany": "?????????",



and



elif self.region2 == "Germany":

countryheader = "DEU"

would like to try the German login because it is very slow and does not always respond

Leave the region id as the uk/Europe one, just change the country codes.

Also that login string you showed isn't for the fordpass app so the token won't work. It needs to have a callback_url as fordpass://token

from fordpass-ha.

creedda avatar creedda commented on July 21, 2024

Can I confirm the token you are entering into the box starts with fordpass://

Yes, i can confirm that.

Just for fun I tried entering just the token and not the full URL and I got a validation error. (a different error than I am seeing)

from fordpass-ha.

crslen avatar crslen commented on July 21, 2024

It took me a couple of attempts, but I was successfully able to get the token and add my vehicle to HA for the US region.

from fordpass-ha.

DougSisk avatar DougSisk commented on July 21, 2024

I had to delete my original vehicle device to get it to work. New region config doesn't line up with the old and I didn't see a way to change that on the existing device.

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 584, in async_setup
    result = await component.async_setup_entry(hass, self)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/__init__.py", line 65, in async_setup_entry
    coordinator = FordPassDataUpdateCoordinator(hass, user, password, vin, region, update_interval, 1)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/__init__.py", line 189, in __init__
    self.vehicle = Vehicle(user, password, vin, region, save_token, config_path)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 64, in __init__
    self.region = REGIONS[region]["region"]
                  ~~~~~~~^^^^^^^^
KeyError: 'North America & Canada'

from fordpass-ha.

creedda avatar creedda commented on July 21, 2024

Another error I am seeing:

2024-06-03 18:12:31.681 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 210, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp_session/__init__.py", line 199, in factory
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 295, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 71, in with_admin
    return await func(self, request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 222, in post
    return await super().post(request, flow_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 73, in wrapper
    return await method(view, request, data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 122, in post
    result = await self._flow_mgr.async_configure(flow_id, data)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 368, in async_configure
    result = await self._async_configure(flow_id, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 414, in _async_configure
    result = await self._async_handle_step(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 518, in _async_handle_step
    result: _FlowResultT = await getattr(flow, method)(user_input)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 171, in async_step_token
    info = await validate_token(self.hass, user_input)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 64, in validate_token
    results = await hass.async_add_executor_job(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 116, in generate_tokens
    return self.generate_fulltokens(req.json())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 119, in generate_fulltokens
    data = {"idpToken": token["access_token"]}
                        ~~~~~^^^^^^^^^^^^^^^^
KeyError: 'access_token'

from fordpass-ha.

mlewanca avatar mlewanca commented on July 21, 2024

Tested with North America and Canada.

Link does not load. It seems that it wants to open the App.

https://login.ford.com/4566605f-43a7-400a-946e-89cc9fdb0bd7/B2C_1A_SignInSignUp_EN-AU/oauth2/v2.0/authorize?redirect_uri=fordapp://userauthorized&response_type=code&max_age=3600&code_challenge=dayR7BUtjUozeXFJMsjJppl22FEXal_FVKwRJlz3oFI&code_challenge_method=S256&scope=%2009852200-05fd-41f6-8c21-d36d3497dc64%20openid&client_id=09852200-05fd-41f6-8c21-d36d3497dc64&ui_locales=EN-AU&language_code=EN-AU&country_code=AUS&ford_application_id=71A3AD0A-CF46-4CCF-B473-FC7FE5BC4592

from fordpass-ha.

BluThunder2k avatar BluThunder2k commented on July 21, 2024

I've copied the files over and am trying to get the token to work with a US login. I get the developer tool string - but mine is "fordapp://userauthorized/?code=" and the string. I get unknown error occurred as another did above. No where in the network tab on the URL I am given has "fordpass". Anyone have any suggestions?

I as well have the " KeyError: 'access_token' " entry in my logs (with all the other entries matching what's been posted above).

from fordpass-ha.

ghostbitmeta avatar ghostbitmeta commented on July 21, 2024

My sensors don't seem to update unless I manually reload the integration (had not updated in a week)

from fordpass-ha.

mlewanca avatar mlewanca commented on July 21, 2024

Tested with North America and Canada.

Link does not load. It seems that it wants to open the App.

https://login.ford.com/4566605f-43a7-400a-946e-89cc9fdb0bd7/B2C_1A_SignInSignUp_EN-AU/oauth2/v2.0/authorize?redirect_uri=fordapp://userauthorized&response_type=code&max_age=3600&code_challenge=dayR7BUtjUozeXFJMsjJppl22FEXal_FVKwRJlz3oFI&code_challenge_method=S256&scope=%2009852200-05fd-41f6-8c21-d36d3497dc64%20openid&client_id=09852200-05fd-41f6-8c21-d36d3497dc64&ui_locales=EN-AU&language_code=EN-AU&country_code=AUS&ford_application_id=71A3AD0A-CF46-4CCF-B473-FC7FE5BC4592

This solved my issue:

#488 (comment)

from fordpass-ha.

tunisiano187 avatar tunisiano187 commented on July 21, 2024

OK, tryied your solution, but ... i received this error
fordapp://userauthorized/?error=server_error&error_description=AADB2C90002%3a+The+CORS+resource+%27https%3a%2f%2fprodb2cuicontentdelivery-d0bbevfjaxfmedda.z01.azurefd.net%2fb2cui%2fui%2fford%2fEN-IE%2funified.html%3fver%3d20240111.4%26SessionId%3d74dec7b6-c56e-44fb-9d64-f1590edd9920%26InstanceId%3dc990bb7a-51f4-439b-bd36-9c07fb1041c0%27+returned+a+404+not+found.%0d%0aCorrelation+ID%3a+74dec7b6-c56e-44fb-9d64-f1590edd9920%0d%0aTimestamp%3a+2024-06-06+19%3a51%3a19Z%0d%0a

from fordpass-ha.

mlewanca avatar mlewanca commented on July 21, 2024

My sensors don't seem to update unless I manually reload the integration (had not updated in a week)

I seem to have the same issue. Its not updating.

from fordpass-ha.

chrestme avatar chrestme commented on July 21, 2024

Another error I am seeing:

2024-06-03 18:12:31.681 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 210, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp_session/__init__.py", line 199, in factory
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 295, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 71, in with_admin
    return await func(self, request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 222, in post
    return await super().post(request, flow_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 73, in wrapper
    return await method(view, request, data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 122, in post
    result = await self._flow_mgr.async_configure(flow_id, data)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 368, in async_configure
    result = await self._async_configure(flow_id, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 414, in _async_configure
    result = await self._async_handle_step(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 518, in _async_handle_step
    result: _FlowResultT = await getattr(flow, method)(user_input)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 171, in async_step_token
    info = await validate_token(self.hass, user_input)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 64, in validate_token
    results = await hass.async_add_executor_job(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 116, in generate_tokens
    return self.generate_fulltokens(req.json())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 119, in generate_fulltokens
    data = {"idpToken": token["access_token"]}
                        ~~~~~^^^^^^^^^^^^^^^^
KeyError: 'access_token'

I'm getting this same error. I tried rebuilding the POST request directly in a python interpreter to see what the response code and text were. I got a 400 response, and the following text:
>>> req.text '{"error":"invalid_grant","error_description":"AADB2C90090: The provided JWE is not a valid 5 segment token.\\r\\nCorrelation ID: 7a7d936c-84b1-480a-b152-e9ed4eaf4f24\\r\\nTimestamp: 2024-06-07 15:54:23Z\\r\\n"}'

from fordpass-ha.

mapero avatar mapero commented on July 21, 2024

OK, tryied your solution, but ... i received this error fordapp://userauthorized/?error=server_error&error_description=AADB2C90002%3a+The+CORS+resource+%27https%3a%2f%2fprodb2cuicontentdelivery-d0bbevfjaxfmedda.z01.azurefd.net%2fb2cui%2fui%2fford%2fEN-IE%2funified.html%3fver%3d20240111.4%26SessionId%3d74dec7b6-c56e-44fb-9d64-f1590edd9920%26InstanceId%3dc990bb7a-51f4-439b-bd36-9c07fb1041c0%27+returned+a+404+not+found.%0d%0aCorrelation+ID%3a+74dec7b6-c56e-44fb-9d64-f1590edd9920%0d%0aTimestamp%3a+2024-06-06+19%3a51%3a19Z%0d%0a

Same here.

from fordpass-ha.

Koosdezwart avatar Koosdezwart commented on July 21, 2024

1.70 works for three days in row. Netherlands.

from fordpass-ha.

chrestme avatar chrestme commented on July 21, 2024

Another error I am seeing:

2024-06-03 18:12:31.681 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 210, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp_session/__init__.py", line 199, in factory
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 295, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 71, in with_admin
    return await func(self, request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 222, in post
    return await super().post(request, flow_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 73, in wrapper
    return await method(view, request, data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 122, in post
    result = await self._flow_mgr.async_configure(flow_id, data)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 368, in async_configure
    result = await self._async_configure(flow_id, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 414, in _async_configure
    result = await self._async_handle_step(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 518, in _async_handle_step
    result: _FlowResultT = await getattr(flow, method)(user_input)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 171, in async_step_token
    info = await validate_token(self.hass, user_input)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 64, in validate_token
    results = await hass.async_add_executor_job(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 116, in generate_tokens
    return self.generate_fulltokens(req.json())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 119, in generate_fulltokens
    data = {"idpToken": token["access_token"]}
                        ~~~~~^^^^^^^^^^^^^^^^
KeyError: 'access_token'

I'm getting this same error. I tried rebuilding the POST request directly in a python interpreter to see what the response code and text were. I got a 400 response, and the following text:
>>> req.text '{"error":"invalid_grant","error_description":"AADB2C90090: The provided JWE is not a valid 5 segment token.\\r\\nCorrelation ID: 7a7d936c-84b1-480a-b152-e9ed4eaf4f24\\r\\nTimestamp: 2024-06-07 15:54:23Z\\r\\n"}'

Another error I am seeing:

2024-06-03 18:12:31.681 ERROR (MainThread) [aiohttp.server] Error handling request
Traceback (most recent call last):
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request
    resp = await request_handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_app.py", line 543, in _handle
    resp = await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp/web_middlewares.py", line 114, in impl
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 92, in security_filter_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 210, in forwarded_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 26, in request_context_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/site-packages/aiohttp_session/__init__.py", line 199, in factory
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 295, in auth_middleware
    return await handler(request)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 32, in headers_middleware
    response = await handler(request)
               ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 73, in handle
    result = await handler(request, **request.match_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 71, in with_admin
    return await func(self, request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 222, in post
    return await super().post(request, flow_id)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 73, in wrapper
    return await method(view, request, data, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 122, in post
    result = await self._flow_mgr.async_configure(flow_id, data)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 368, in async_configure
    result = await self._async_configure(flow_id, user_input)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 414, in _async_configure
    result = await self._async_handle_step(
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 518, in _async_handle_step
    result: _FlowResultT = await getattr(flow, method)(user_input)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 171, in async_step_token
    info = await validate_token(self.hass, user_input)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/config_flow.py", line 64, in validate_token
    results = await hass.async_add_executor_job(
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 116, in generate_tokens
    return self.generate_fulltokens(req.json())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/fordpass/fordpass_new.py", line 119, in generate_fulltokens
    data = {"idpToken": token["access_token"]}
                        ~~~~~^^^^^^^^^^^^^^^^
KeyError: 'access_token'

I'm getting this same error. I tried rebuilding the POST request directly in a python interpreter to see what the response code and text were. I got a 400 response, and the following text: >>> req.text '{"error":"invalid_grant","error_description":"AADB2C90090: The provided JWE is not a valid 5 segment token.\\r\\nCorrelation ID: 7a7d936c-84b1-480a-b152-e9ed4eaf4f24\\r\\nTimestamp: 2024-06-07 15:54:23Z\\r\\n"}'

Update: I tried the login process from a different browser (Chrome) and it worked. I had been using Firefox before.

from fordpass-ha.

nexusis7 avatar nexusis7 commented on July 21, 2024

i've followe the instructions and manually updated to 1.70 but after entering the fordapp code, i just get Unknown error occurred repeatedly. i logged out and signed in again with new fordapp code, same error on home assistant

Opera Snapshot_2024-06-11_190358_homeassistant local

from fordpass-ha.

Next9999 avatar Next9999 commented on July 21, 2024

Working fin on my end "Canada"

Script to reload /refresh Data is also good :-)

from fordpass-ha.

tunisiano187 avatar tunisiano187 commented on July 21, 2024

Maybe we need to add also Belgium (be-fr) .be for it to work for me, (i've tryied to just update the login link copied, with .be, but it didn't work

from fordpass-ha.

chrestme avatar chrestme commented on July 21, 2024

i've followe the instructions and manually updated to 1.70 but after entering the fordapp code, i just get Unknown error occurred repeatedly. i logged out and signed in again with new fordapp code, same error on home assistant

Opera Snapshot_2024-06-11_190358_homeassistant local

Have you tried using a different browser? Firefox wouldn't work for me, but Chrome did. You can also try using a private browsing/incognito window or clearing cookies/cache.

from fordpass-ha.

seebaer1976 avatar seebaer1976 commented on July 21, 2024

I was able to get the token without any problems.

I just noticed that not all sensors are updated for a longer period of time

There are three warnings in the logs:

1:
Returning Stale data to prevent unavaliable status
2:
Error communicating with FordPass for XXXXXXXXXX
and
502 Server Error: Bad Gateway for url: https://api.mps.ford.com/api/expdashboard/v1/details/

from fordpass-ha.

navarrolux avatar navarrolux commented on July 21, 2024

Hello all. I was finally able to import the 1.70 files and logged in successfully.
I have noticed a couple of things:

  • The door lock always shows unlocked. For example, if it is unlocked and I trigger a lock call after it processes and the doors actually lock the entity still shows unlocked.

Nice work with getting it to this point.

from fordpass-ha.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.