2015-01-18 2 views
0

Я использую flask-dance для аутентификации на серверах Google.Ошибка Flask-Dance: область изменена

Config для колба-данса:

from flask.ext.dance.contrib.google import make_google_blueprint 
google_blueprint = make_google_blueprint (
    client_id=app.config['GOOGLE']['client_id'], 
    client_secret=app.config['GOOGLE']['client_secret'], 
    scope=["profile", "email"], 
    redirect_to="main.index", 
    login_url="/", 
    authorized_url="/authorized", 
) 
app.register_blueprint(google_blueprint,url_prefix="/login") 

Однако я получаю Warning: Scope has changed from "profile email" to "". после пройти через верительное диалоговое окно Google.

Вот полный след:

Traceback (most recent call last): 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__ 
    return self.wsgi_app(environ, start_response) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1820, in wsgi_app 
    response = self.make_response(self.handle_exception(e)) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1403, in handle_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app 
    response = self.full_dispatch_request() 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request 
    rv = self.handle_user_exception(e) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception 
    reraise(exc_type, exc_value, tb) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request 
    rv = self.dispatch_request() 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/flask_dance/consumer/oauth2.py", line 168, in authorized 
    client_secret=self.client_secret, 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/requests_oauthlib/oauth2_session.py", line 199, in fetch_token 
    self._client.parse_request_body_response(r.text, scope=self.scope) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/clients/base.py", line 409, in parse_request_body_response 
    self.token = parse_token_response(body, scope=scope) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 376, in parse_token_response 
    validate_token_parameters(params) 
    File "/home/xxx/.virtualenvs/flask/lib/python2.7/site-packages/oauthlib/oauth2/rfc6749/parameters.py", line 406, in validate_token_parameters 
    raise w 
Warning: Scope has changed from "profile email" to "". 

На Chrome Dev консоли я получаю это (после того, как в окне Account Chooser прямо перед TRACEBACK):

GET http://localhost:5000/login/authorized?state=11rtXcAHJm0jloiDpM8IrazD9uLT3b…xnXM0ZB1DumOPqFOgu-x19CDSbDfQoKLWVEfBRTQIg.gvDk1rm330AV3oEBd8DOtNAR0Vr7lQI 500 (INTERNAL SERVER ERROR) 
Navigated to http://localhost:5000/login/authorized?state=11rtXcAHJm0jloiDpM8IrazD9uLT3b…xnXM0ZB1DumOPqFOgu-x19CDSbDfQoKLWVEfBRTQIg.gvDk1rm330AV3oEBd8DOtNAR0Vr7lQI 

Если я os.environ['OAUTHLIB_RELAX_TOKEN_SCOPE'] = '1' это работает, но я не думаю, что это решение, но больше обходное решение пока. :(

Я открыл билет по этому вопросу Google OAuth2 returns no scope on authentication breaks scope test #306 по этому вопросу.

Из того, что я могу сказать от http://tools.ietf.org/html/rfc6749#section-3.3, Google не требуется, чтобы вернуть сферу (если объем не изменился), я читал это правильно?

ответ

1

Ближайшей вещь, которую я могу понять это есть ошибка в oauthlib плагине, который я открыл bug report с уже.

Из отчета об ошибке, вы можете решить проблему, изменив файл /oauth2/rfc6749/tokens.py в плагин на линии 30 от self._new_scope = set(utils.scope_to_list(params.get('scope', ''))) к self._new_scope = set(utils.scope_to_list(params.get('scope', old_scope)))

Fix был слит: https://github.com/idan/oauthlib/pull/323

Смежные вопросы