Токен обновления Google OAuth 2 отсутствует для веб-приложения, но присутствует для localhost - PullRequest
0 голосов
/ 16 ноября 2018

Проблема: отсутствует токен обновления OAuth 2.

Проблема в том, что версия localhost получает Refresh Token как часть предоставленного токена, но тот же код, работающий в GCE, не делает.

Подробности:

Я написал приложение Python Flask, которое реализует Google OAuth 2.0.Это веб-приложение работает в облаке с подтвержденным доменным именем, действительным сертификатом SSL и конечной точкой HTTPS.Это веб-приложение без изменений также работает как localhost.Разница между средой выполнения заключается в том, что версия localhost не использует TLS.Других отличий в потоке кода нет.

Кроме Refresh Token отсутствует, и я не могу автоматически обновить token, все работает отлично.

Я тщательно исследовал эту проблему,Проблемы API, такие как access_type=offline и т. Д., Правильно реализованы, иначе я бы не получил Refresh Token в версии localhost.

Я использую библиотеку requests_oauthlib python.

gcp = OAuth2Session(
        app.config['gcp_client_id'],
        scope=scope,
        redirect_uri=redirect_uri)

# print('Requesting authorization url:', authorization_base_url)

authorization_url, state = gcp.authorization_url(
                        authorization_base_url,
                        access_type="offline",
                        prompt="select_account",
                        include_granted_scopes='true')

session['oauth_state'] = state

return redirect(authorization_url)


# Next section of code after the browser approves the request

token = gcp.fetch_token(
            token_url,
            client_secret=app.config['gcp_client_secret'],
            authorization_response=request.url)

Токен имеет refresh_token при работе в localhost, но не при работе в облаке.

В этом документе Google обсуждаются токены обновления, которые указывают, что он поддерживается для веб-приложений.

Обновление токена доступа (автономный доступ)

[Обновление 18.11.2008]

Я нашел это сообщение об ошибке, который дал мне подсказку изменить мой код с этого:

authorization_url, state = gcp.authorization_url(
                            authorization_base_url,
                            access_type="offline",
                            prompt="select_account",
                            include_granted_scopes='true')

на этот:

authorization_url, state = gcp.authorization_url(
                            authorization_base_url,
                            access_type="offline",
                            prompt="consent",
                            include_granted_scopes='true')

Теперь я получаю токен обновления в общедоступной версии сервера иверсия localhost.

Далее я искал документацию по параметру prompt и обнаружил следующее:

Подсказка OpenID Conect

подсказка (Необязательно)

Список строковых значений, разделенных пробелами, который указывает, требуется ли авторизацияrver запрашивает у пользователя повторную аутентификацию и согласие.Возможные значения:

нет Сервер авторизации не отображает экраны аутентификации или согласия пользователя;он вернет ошибку, если пользователь еще не аутентифицирован и не имеет предварительно настроенного согласия для запрошенных областей.Вы не можете использовать ни один, чтобы проверить существующую аутентификацию и / или согласие.

согласие Сервер авторизации запрашивает согласие пользователя перед возвратом информации клиенту.

select_account Сервер авторизации предлагает пользователю выбратьучетная запись пользователя.Это позволяет пользователю, имеющему несколько учетных записей на сервере авторизации, выбирать среди нескольких учетных записей, для которых они могут иметь текущие сеансы.

Если значение не указано и пользователь ранее не разрешал доступ, то пользователю показывается экран согласия.

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

access_type (Необязательно)

Допустимые значения - офлайн и онлайн.Эффект задокументирован в автономном доступе;если запрашивается токен доступа, клиент не получает токен обновления, если не указан автономный режим.

Это утверждение вызвало у меня большую путаницу при попытке отладки, почему я не смог получить токен обновления дляверсия публичного сервера, но я мог бы для версии localhost.

...