Authlib сообщает об ошибке «Ошибка при попытке расшифровать строку без кода» при использовании appauth для Android и нескольких значений области - PullRequest
0 голосов
/ 12 сентября 2018

Я пробую Authlib.У меня есть рабочий бэкэнд pyoidc и тестовое приложение с использованием Android Appauth (изменено из учебника Google Codelabs).Я перенастроил тестовое приложение для Android для установки Authlib на моей локальной машине.Теперь я получаю эту ошибку при попытке сделать запрос авторизации с несколькими областями (я обрезал строковую часть до соответствующей части):

ValueError: Error trying to decode a non urlencoded string. Found invalid characters: {' '} in the string: '...&scope=openid offline_access&...'. Please ensure the request/response body is x-www-form-urlencoded.

Я начал отслеживать проблему с трассировки стека иrequest_uri со стороны андроида.Но запрос uri содержал ошибочную часть как ...&scope=openid%20offline_access&....

. Я распечатал параметр environ из __call__ *1009*, и я вижу, что эти релевантные записи снова уменьшены досфера:

{
  ...
  'QUERY_STRING': '...&scope=openid%20offline_access&...', 
  ...
  'werkzeug.request': <BaseRequest 'http://10.0.2.2:5000/oauth/authorize?...&scope=openid offline_access&...' [GET]>
}

Я так растерялся.Почему werkzeug.request появляется перед предварительным декодированием строки перед заполнением этого аргумента в environ, а затем urls/url_decode из authlib вызывается для werkzeug.request?Была ли %20 недостаточная или неправильная кодировка?Но если да, то как это сочетается с тем, что это поведение по умолчанию app_auth_android, которое работало против другого бэкэнда oidc и схемы единого входа google?

Полная трассировка стека:

Traceback (most recent call last):
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/mliu/Documents/Development/authlib/example-oauth2-server/website/routes.py", line 69, in authorize
    grant = authorization.validate_consent_request(end_user=user)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/authlib/flask/oauth2/authorization_server.py", line 206, in validate_consent_request
    req = _create_oauth2_request(request)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/authlib/flask/oauth2/authorization_server.py", line 272, in _create_oauth2_request
    q.headers
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/authlib/specs/rfc6749/wrappers.py", line 39, in __init__
    self.query_params = url_decode(self.query)
  File "/Users/mliu/.local/share/virtualenvs/authlib-mtpFpWgH/lib/python3.7/site-packages/authlib/common/urls.py", line 64, in url_decode
    raise ValueError(error % (set(query) - urlencoded, query))
ValueError: Error trying to decode a non urlencoded string. Found invalid characters: {' '} in the string: '...&scope=openid offline_access&...'. Please ensure the request/response body is x-www-form-urlencoded.

1 Ответ

0 голосов
/ 15 сентября 2018

Да, я это подтвердил. На данный момент вы можете делать запросы только с +:

scope=openid+offline_access

, чтобы предотвратить эту проблему. Я исправил это в Authlib: https://github.com/lepture/authlib/commit/d8ab09fb97169fc47070f48c2ede43348f1feff0

Это также должно быть исправлено werkzeug: https://github.com/pallets/werkzeug/pull/1363

...