Проблема: отсутствует токен обновления OAuth 2.
Проблема в том, что локальная версия получает Refresh Token
как часть предоставленного токена, но тот же код, работающий в GCE, этого не делает.
Подробности:
Я написал приложение Python Flask, которое реализует Google OAuth 2.0. Это веб-приложение работает в облаке с проверенным доменным именем, действительным сертификатом SSL и конечной точкой HTTPS. Это немодифицированное веб-приложение также работает как localhost
. Отличия среды выполнения в том, что версия для локального хоста не использует TLS. Других отличий в потоке кода нет.
За исключением того, что Refresh Token
отсутствует, и я не могу автоматически обновить token
, все работает отлично.
Я тщательно исследовал этот вопрос. Проблемы API, такие как access_type=offline
и т. д., реализованы правильно, иначе я бы не получил Refresh Token
в версии localhost
.
Я использую библиотеку Python requests_oauthlib
.
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.2018]
Я нашел этот отчет об ошибке, который дал мне подсказку изменить мой код:
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')
Теперь я получаю токен обновления в версии для общедоступного сервера и версии для локального хоста.
Затем я искал документацию по опции prompt
и нашел это:
подсказка (необязательно)
Разделенный пробелами список строковых значений, указывающий, будет ли сервер авторизации запрашивать у пользователя повторную аутентификацию и согласие. Возможные значения:
нет Сервер авторизации не отображает никаких экранов проверки подлинности или согласия пользователя; он вернет ошибку, если пользователь еще не аутентифицирован и не имеет предварительно настроенного согласия для запрошенных областей. Вы можете использовать none для проверки существующей аутентификации и/или согласия.
согласие Сервер авторизации запрашивает у пользователя согласие, прежде чем вернуть информацию клиенту.
select_account Сервер авторизации предлагает пользователю выбрать учетную запись пользователя. Это позволяет пользователю, имеющему несколько учетных записей на сервере авторизации, выбирать из нескольких учетных записей, для которых у него могут быть текущие сеансы.
Если значение не указано и пользователь ранее не авторизовал доступ, пользователю отображается экран согласия.
Я думаю, что документация Google должна быть обновлена. На той же странице появляется следующий текст:
access_type (необязательно)
Допустимые значения: offline и online. Эффект задокументирован в автономном доступе; если запрашивается токен доступа, клиент не получает токен обновления, если не указан автономный режим.
Это утверждение вызвало у меня много путаницы при попытке отладки, почему я не мог получить токен обновления для версии общедоступного сервера, но мог для версии локального хоста.
offline
доступ при аутентификации учетной записи пользователя. - person John Hanley   schedule 03.08.2020offline
доступу`. Я очень хорошо понимаю OAuth в GCP. Я Google GDE с внутренним доступом. Я предлагаю вам создать вопрос и самостоятельно ответить. Этой теме почти два года. Что касается ключей API, то теперь они считаются устаревшими, и Google постепенно отказывается от них. Ваша причина использования учетных записей служб по сравнению с учетными записями пользователей неверна. Право собственности на данные не имеет отношения к тому, какой метод следует использовать. - person John Hanley   schedule 03.08.2020