Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

http://, localhost, IPs not supported in callback URL, Missing Token Error #12

Open
tolrahC opened this issue Jan 16, 2019 · 14 comments
Open

Comments

@tolrahC
Copy link

tolrahC commented Jan 16, 2019

I'm having an issue when trying to configure the Nokia connection.
First: Now Nokia require a callback url that does not contain an ip address or localhost, also the port must be 80 or 443.
Secondly: I'm having this error when trying to create the connection with Nokia, in automatic or manual mode

Traceback (most recent call last):
  File "D:\Tools\nokia-weight-sync\nokia-weight-sync.py", line 262, in <module>
    setup_nokia( options, config )
  File "D:\Tools\nokia-weight-sync\nokia-weight-sync.py", line 128, in setup_nokia
    creds = auth.get_credentials(nokia_auth_code)
  File "D:\Tools\nokia-weight-sync\nokia.py", line 87, in get_credentials
    client_secret=self.consumer_secret)
  File "C:\Users\tolra\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests_oauthlib\oauth2_session.py", line 307, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "C:\Users\tolra\AppData\Local\Programs\Python\Python37-32\lib\site-packages\oauthlib\oauth2\rfc6749\clients\base.py", line 415, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "C:\Users\tolra\AppData\Local\Programs\Python\Python37-32\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 425, in parse_token_response
    validate_token_parameters(params)
  File "C:\Users\tolra\AppData\Local\Programs\Python\Python37-32\lib\site-packages\oauthlib\oauth2\rfc6749\parameters.py", line 435, in validate_token_parameters
    raise MissingTokenError(description="Missing access token parameter.")
oauthlib.oauth2.rfc6749.errors.MissingTokenError: (missing_token) Missing access token parameter.
@magnific0
Copy link
Owner

magnific0 commented Jan 16, 2019

@tolrahC again thanks for raising the issue. I will update the documentation and some other older issues soon and think more about a proper solution.

Solution A: using automatic authorization

  1. using a proper domain name and point it to your public IP and make sure the router handles the port forwarding to the machine requesting the authorization.
  2. pick any fictitious domain name (e.g., example.com) and redirect it to 127.0.0.1 by editing the hosts file.

Both solutions are not ideal, because the http scheme is not allowed anymore. So you'll have to setup certificates and modify the Python application or using an reverse proxy to host a HTTPS front calling back to a HTTP url.

Solution B: using manual authorization

This is probably easier at the moment.

  1. Point it to a site like: https://httpbin.org/anything (allowed by Withings, I checked). Copy the response from the browser back into the application.

Please let me know if any of this works out for you!

@magnific0 magnific0 changed the title Missing Token Error http://, localhost, IPs not supported in callback URL, Missing Token Error Jan 16, 2019
@tolrahC
Copy link
Author

tolrahC commented Jan 16, 2019

@magnific0 I still have the missing token error doing solution B.

@rafdev18
Copy link

@magnific0 same behavior here ... tried several times ... not a user error ;)

.... parameters.py", line 435, in validate_token_parameters
raise MissingTokenError(description="Missing access token parameter.")
oauthlib.oauth2.rfc6749.errors.MissingTokenError: (missing_token) Missing access token parameter.

@piccit
Copy link

piccit commented Jan 16, 2019

I'm not sure that Withing's end is fully working right now, my IFTTT integration hasn't worked since the 14th

@tolrahC
Copy link
Author

tolrahC commented Feb 3, 2019

@magnific0 I finally got it working manually using curl (Nokia Help here)

I never worked with Python before, but after a quick debug session the problem seems to come from the OAuth2Session class, but I guess you already know that ;)

@cristian5th
Copy link

Hello.

Has the MissingTokenError issue been solved? I have just launched the script in a new computer and I'm getting this error.

I cannot use the localhost solution as in my old computer because Nokia wouldn't allow it so I switched to @magnific0's proposal of using https://httpbin.org/anything with a manual authorisation, but after I copy the code back into the script, I get this MissingTokenError.

@tolrahC, how did you managed to get it working manually?

Thank you all. Regards.

@magnific0
Copy link
Owner

Hi, I'm not sure what the timeout is exactly, but you need to be rather quick in copying the values over. Maybe that helps?

@cristian5th
Copy link

cristian5th commented Apr 6, 2019

How fast should I be? :)

I believe there are two different issues here. As you told me to be fast, I tried several times intending to be as fast as I can be, and once I got a timeout issue which is not the missing token issue that I was having previously.

Most of the times I try the manual configuration, the error I get back is this one:

Traceback (most recent call last):
  File "nokia-weight-sync.py", line 262, in <module>
    setup_nokia( options, config )
  File "nokia-weight-sync.py", line 128, in setup_nokia
    creds = auth.get_credentials(nokia_auth_code)
  File "/Users/cralvarez/Python_scripts/nokia-weight-sync/nokia.py", line 87, in get_credentials
    client_secret=self.consumer_secret)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests_oauthlib/oauth2_session.py", line 307, in fetch_token
    self._client.parse_request_body_response(r.text, scope=self.scope)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 415, in parse_request_body_response
    self.token = parse_token_response(body, scope=scope)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 425, in parse_token_response
    validate_token_parameters(params)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 435, in validate_token_parameters
    raise MissingTokenError(description="Missing access token parameter.")
oauthlib.oauth2.rfc6749.errors.MissingTokenError: (missing_token) Missing access token parameter.

It seems to me as an authorisation problem.

One of my latests tries, the one I thought to be the fastest, I got a totally different error. I see the timeout you are talking about.

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 343, in _make_request
    self._validate_conn(conn)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 839, in _validate_conn
    conn.connect()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connection.py", line 344, in connect
    ssl_context=context)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/util/ssl_.py", line 344, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 412, in wrap_socket
    session=session
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 853, in _create
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py", line 1117, in do_handshake
    self._sslobj.do_handshake()
socket.timeout: _ssl.c:1039: The handshake operation timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/adapters.py", line 449, in send
    timeout=timeout
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 638, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/util/retry.py", line 367, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/packages/six.py", line 686, in reraise
    raise value
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 600, in urlopen
    chunked=chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 346, in _make_request
    self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/connectionpool.py", line 306, in _raise_timeout
    raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='account.withings.com', port=443): Read timed out. (read timeout=2)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "nokia-weight-sync.py", line 262, in <module>
    setup_nokia( options, config )
  File "nokia-weight-sync.py", line 128, in setup_nokia
    creds = auth.get_credentials(nokia_auth_code)
  File "/Users/cralvarez/Python_scripts/nokia-weight-sync/nokia.py", line 87, in get_credentials
    client_secret=self.consumer_secret)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests_oauthlib/oauth2_session.py", line 284, in fetch_token
    verify=verify, proxies=proxies)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 581, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests_oauthlib/oauth2_session.py", line 425, in request
    headers=headers, data=data, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/sessions.py", line 646, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/requests/adapters.py", line 529, in send
    raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='account.withings.com', port=443): Read timed out. (read timeout=2)

What do you think of this?

Thanks.

@tolrahC
Copy link
Author

tolrahC commented Apr 19, 2019

@cristian5th I retrieved the accces token using curl and putted it in the config.ini file.

The config file should look like this:
`[garmin]
username = your_garmin_username
password = your_garmin_password

[nokia]
consumer_key = generated_consumer_key_from_the_procedure
consumer_secret = generated_consumer_secret_from_the_procedure
callback_uri = https://httpbin.org/anything
access_token = token_retrieved_from_curl
token_expiry = expirency_retrieved_from_curl
token_type = Bearer
refresh_token = refreshtoken_retrieved_from_curl
user_id = not_sure_about_this_one_before_probably_from_curl`

@cristian5th
Copy link

Hi @tolrahC

What is the url you are feeding to curl? Any specific argument? I'm trying with the url given as answer when I authorise the application at Nokia but all curl is giving me back is the same informations as the Nokia webpage. There is no token nowhere.

{
  "args": {
    "code": "8329710c7e3f1517186367b6bb47c23f65fa6377"
  }, 
  "data": "", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.54.0"
  }, 
  "json": null, 
  "method": "GET", 
  "origin": "88.188.103.26, 88.188.103.26", 
  "url": "https://httpbin.org/anything?code=8329710c7e3f1517186367b6bb47c23f65fa6377"
}

Then, you are stating that I should simply write the config.ini file with this data but, how is it that the config.ini file which I retrieved from my old computer was also raising the missing token error? I was originally configured with the localhost callback URL and I moved all the files from the old to the new computer, including the config.ini. There I got the missing token error so I tried to simply delete the application at Nokia and start everything again. Since then, I haven't managed to make it work, always because of the missing token error.

I have just downloaded the latest update but I still have the same issue.

Thank you. Regards.

@tolrahC
Copy link
Author

tolrahC commented Apr 20, 2019

@cristian5th You have to use this method here

@cristian5th
Copy link

What a trip! Finally! It worked following the method you mentioned @tolrahC.

Thank you very much for your help and your patience.

@g3d12
Copy link

g3d12 commented Aug 22, 2019

I am trying to register for api access at https://account.withings.com/partner/add_oauth2
but I cannot figure out what format and what url shoudl be provided. In guidlines it says http://developer.withings.com/oauth2/#tag/glossary that it needs to be URL-encoded string. I tried:
https://httpbin.org/anything
https%3A%2F%2Fhttpbin.org%2Fanything
httpbin.org/anything
httpbin.org%2Fanything
It always says as response: This is not a valid URL.
Any help. I want to use the script to schedule on daily basis sending weight to garmin connect on RPI. Thanks for any help.

@samwiseg0
Copy link

An easier workaround is to make sure requests-oauthlib v1.0.0 is installed.

To force a specific version use:

pip install requests-oauthlib==1.0.0

I would also recommend that a virtual environment be created for the script:

cd nokia-weight-sync/

#You may need to change python3 to python depending on your os
python3 -m venv ./venv

#Install requirements
./venv/bin/python -m pip install arrow requests-oauthlib==1.0.0

#Run the script
./venv/bin/python ./nokia-weight-sync.py -k CLIENT_ID -s CONSUMER_SECRET setup nokia

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants