2016-04-10 1 views
1

Я использую следующий код для проверки подлинности с помощью OAuth 2.0Недопустимый состояние запроса: oauth2 колбу

oauth2.init_app(
    app, 
    scopes=['email', 'profile'], 
    authorize_callback=_request_user_info) 

Маршрут выглядит следующим образом

@app.route('/') 
@oauth2.required 
def hello(): 
    """Return a friendly HTTP greeting.""" 
    return 'Hello ' + session['profile']['displayName'] 

Метод аутентификации обратного вызова

def _request_user_info(credentials): 
    """ 
    Makes an HTTP request to the Google+ API to retrieve the user's basic 
    profile information, including full name and photo, and stores it in the 
    Flask session. 
    """ 
    http = httplib2.Http() 
    credentials.authorize(http) 
    resp, content = http.request(
     'https://www.googleapis.com/plus/v1/people/me') 

    if resp.status != 200: 
     current_app.logger.error(
      "Error while obtaining user profile: %s" % resp) 
     return None 

    session['profile'] = json.loads(content) 

Я вижу экран согласия, а затем после этого слишком много перенаправлений. Журналы показывают следующее.

NFO:werkzeug:127.0.0.1 - - [10/Apr/2016 15:25:21] "GET/HTTP/1.1" 302 - 
INFO:werkzeug:127.0.0.1 - - [10/Apr/2016 15:25:21] "GET /oauth2authorize?scopes=profile&scopes=email&return_url=http%3A%2F%2F127.0.0.1%3A8080%2F HTTP/1.1" 302 - 
INFO:oauth2client.client:Successfully retrieved access token 
INFO:werkzeug:127.0.0.1 - - [10/Apr/2016 15:25:27] "GET /oauth2callback?state=%7B%22csrf_token%22:+%22aa7d28d2496c0e0714eac20b902c1e4db21677d333a837d743525a9696d6c976%22,+%22return_url%22:+%22http://127.0.0.1:8080/%22%7D&code=4/Kz1xkENjHrTzLphfEG8CGND7tkeGXxjIffZxMwSr_hU HTTP/1.1" 302 - 
INFO:werkzeug:127.0.0.1 - - [10/Apr/2016 15:25:27] "GET/HTTP/1.1" 302 - 
INFO:werkzeug:127.0.0.1 - - [10/Apr/2016 15:25:27] "GET /oauth2authorize?scopes=profile&scopes=email&return_url=http%3A%2F%2F127.0.0.1%3A8080%2F HTTP/1.1" 302 - 
INFO:oauth2client.client:Received token response with no refresh_token. Consider reauthenticating with approval_prompt='force'. 
INFO:oauth2client.client:Successfully retrieved access token 
INFO:werkzeug:127.0.0.1 - - [10/Apr/2016 15:25:28] "GET /oauth2callback?state=%7B%22csrf_token%22:+%22862efe9c1803e12c5c1323b5f68d8bbf185ba89d5d46268924ac527d3dca886c%22,+%22return_url%22:+%22http://127.0.0.1:8080/%22%7D&code=4/nU8o3y3zslgd9KVXJ_NDtzJUZfABeF6ka4IbYSiGKcs HTTP/1.1" 302 - 
INFO:werkzeug:127.0.0.1 - - [10/Apr/2016 15:25:28] "GET/HTTP/1.1" 302 - 

В конце концов я вижу страницу со словами. Invalid состояние запроса

enter image description here

ответ

1

Это может произойти, если куки сессии растет большой и новый маркер CSRF не может быть сохранена на сессии. Можете ли вы проверить размеры файлов cookie в своих ответах?

Мы исправили часть этой проблемы с помощью oauth2client 2.0.2, но если вы все еще испытываете ее с этой версией, я хотел бы получить дополнительную информацию.

Мы настоятельно рекомендуем использовать сеанс, поддерживаемый базой данных, например memcache/redis вместо файлов cookie.

+0

Как использовать бэкэнд базы данных с 'oauth2client'? Можно ли использовать простой файл или что-то вместо этого? – vidstige