Срок действия invalid_token & Token истек или был отменен при попытке отозвать токен доступа OAuth2 (вход в Google) - PullRequest
0 голосов
/ 18 января 2019

Я использую Flask & Oauth 2 для аутентификации пользователя в моей системе. Вход в Google работает нормально, но если я продолжаю входить в систему в течение длительного времени, выход из системы выдает эту ошибку.

{
  "error": "invalid_token",
  "error_description": "Token expired or revoked"
}

Я новичок в Flask и веб-разработке и не могу понять, почему это происходит. Если я пытаюсь войти снова, он говорит, что пользователь уже подключен.

Кнопка «Мой вход» HTML

<div id="signinButton">
  <span class="g-signin" 
        data-scope="openid email" 
        data-clientid="<ClientID>.apps.googleusercontent.com" 
        data-redirecturi="postmessage" 
        data-accesstype="offline" 
        data-cookiepolicy="single_host_origin" 
        data-callback="signInCallback" 
        data-approvalprompt="force">
  </span>
</div>

Мой метод отключения: код переходит на ошибку 400

# Google Sign out method
@app.route('/gdisconnect')
def gdisconnect():
    access_token = login_session.get('access_token')
    if access_token is None:
        print 'Access Token is None'
        response = make_response(
            json.dumps('Current user not connected.'), 401
        )
        response.headers['Content-Type'] = 'application/json'
        return response
    print 'In gdisconnect access token is %s' % access_token
    print 'User name is: '
    print login_session['username']
    url = 'https://accounts.google.com/o/oauth2/revoke?token=%s' % login_session['access_token']
    print url
    h = httplib2.Http()
    result = h.request(url, 'GET')[0]
    print 'result is '
    print result
    if result['status'] == '200':
        del login_session['access_token']
        del login_session['gplus_id']
        del login_session['username']
        del login_session['email']
        del login_session['picture']
        response = make_response(json.dumps('Successfully disconnected.'), 200)
        response.headers['Content-Type'] = 'application/json'
        return response
    else:
        response = make_response(
            json.dumps('Failed to revoke token for given user.',
                       400)
        )
        response.headers['Content-Type'] = 'application/json'
        return response

1 Ответ

0 голосов
/ 18 января 2019

Срок действия вашего OAuth Access Token истек. Вам не нужно отзывать маркер доступа с истекшим сроком действия.

Решение состоит в том, чтобы обработать значение токена доступа exp (expires at). Если токен истек, просто удалите его из сеанса пользователя. Ваш код может сохранить это значение во время создания или обновления токена, или вы можете позвонить в конечную точку Google: https://www.googleapis.com/oauth2/v3/tokeninfo, чтобы получить информацию о токене, которая включает в себя значения exp и expires_in. Примечание: эта конечная точка также возвратит ошибку для токена с истекшим сроком действия, поэтому вызывайте его при создании или обновлении.

Другим вариантом является продолжение вызова revoke, но в случае возникновения ошибки проверьте, не истек ли токен. Если значение равно true, игнорируйте ошибку, удалите токен из сеанса и продолжайте работу, не сообщая о проблеме.

Если вы действительно хотите прекратить сеанс OAuth клиента, вы можете отозвать токен обновления (который обычно не истекает). Это отменит все токены доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...