Токен обновления Google OAuth вызывает бесконечный цикл перенаправления после выхода из системы и повторного входа в приложение Django

Я реализую вход в систему Google OAuth2 в приложении на базе Django. Первоначальный вход в систему работает нормально — я получаю как токен доступа, так и токен обновления от Google. Я сохраняю только токен обновления, поскольку срок действия токена доступа истекает через один час, и после этого его нельзя использовать.

После входа в систему пользователь может использовать приложение и выполнять все действия. При выходе из системы я завершаю сеанс и удаляю сохраненные учетные данные.

Однако, когда пользователь пытается снова войти в систему, приложение застревает в бесконечном цикле перенаправления — Google немедленно перенаправляет обратно на мое приложение (поскольку согласие уже было получено), и мое приложение не может аутентифицировать пользователя из-за сбоя обмена токенами обновления, поэтому оно снова запускает процесс входа в систему. Этот цикл повторяется бесконечно.

Несмотря на то, что я сохраняю токен обновления при первом входе в систему и пытаюсь использовать его повторно, это все равно не устраняет проблему. Я подозреваю, что токен обновления автоматически аннулируется (возможно, при повторном входе в систему, смене пароля или внутренней политике ротации Google).

Кроме того, это прерывает выполнение фоновых запланированных задач (например, отправку запланированных электронных писем на основе Gmail API), поскольку они зависят от сохраненного токена обновления для создания токенов доступа, что приводит к сбою, если токен становится недействительным.

Авторизация

authorization_url, state = flow.authorization_url(
    access_type='offline',
    include_granted_scopes='true'
    # Removed 'prompt=consent' to avoid unnecessary refresh token regeneration
)

Сохранение учетных данных (при успешном входе в Систему):

credentials = flow.fetch_token(code=code)
request.session['credentials'] = credentials_to_dict(credentials)

Токен обновления:

if credentials.expired and credentials.refresh_token:
    credentials.refresh(Request())

Выход из системы:

def logout(request):
    django_logout(request)
    request.session.flush()

В чем мне нужна помощь:

  • Существует ли надежный способ сохранить токены обновления, который не вызовет этого цикла перенаправления после выхода из системы?
  • Аннулирует ли Google токены обновления из-за политики сеанса, ограничений на повторное использование токенов или автоматического отзыва?
  • Как я могу структурировать этот поток OAuth таким образом, чтобы запланированные задания (например, вызовы Gmail API) могли продолжать надежно работать после выхода из системы?

Окружение:

  • Django 4.x
  • Python 3.10
  • google-auth, google-auth-oauthlib
  • Веб-приложение Google OAuth

Проверенные ссылки

  • Истечение срока действия токена обновления Google OAuth
  • Цикл перенаправления OAuth2 после выхода из системы

Мы приветствуем любые идеи, исправления или предложения. Заранее спасибо!

Вернуться на верх