Я создаю приложение Python Flask, которое собирает некоторую информацию об учетной записи Google Tag Manager (GTM) пользователя. Для этого мне нужно, чтобы они авторизовали доступ только для чтения к своей учетной записи GTM, а затем я go и получил нужные мне данные.
Идеальный поток здесь:
- Пользователь нажимает кнопку "войти в систему с помощью Google"
- Открывается новая вкладка, предлагающая ему выбрать свою учетную запись Google
- На следующей странице рассказывается, какие разрешения я ищу, и разрешить доступ.
- Они принимают, поток аутентификации завершен, и вкладка закрывается.
Мне удалось запустить приложение локально с нужным потоком, без проблем.
Однако, как только я развернул его в Heroku, я столкнулся с препятствиями, поскольку поток аутентификации просто не работает. Журналы Heroku читаются следующим образом:
If your browser is on a different machine then exit and re-run this
application with the command-line parameter
--noauth_local_webserver
Я немного покопался, добавил args.noauth_local_webserver = True
в качестве параметра к объекту Oauth Flow.
Однако это создает новую проблему, когда при загрузке страницы, это отображается в журналах Heroku:
Go to the following link in your browser:
https://accounts.google.com/o/oauth2/auth?client_id=629932623162-nguh8ssud6her0e6bbc5vloe1k3aq95q.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Ftagmanager.readonly&access_type=offline&response_type=code&prompt=select_account
Enter verification code:
Это работает в моей локальной среде, так как я могу зайти на эту страницу и вставить проверочный код в свою консоль, но не очень полезно для Heroku. Я не уверен, куда я вставлю код подтверждения, и это, безусловно, не имеет смысла, если кто-то, кроме меня, попытается войти в систему.
Кто-нибудь знает, как я могу заставить браузер пользователя автоматически открывать поток аутентификации вместо того, чтобы показывать его в консоли?
Если это поможет, вот функция GetService (), которую я использую (взято из документации Google) ):
def GetService():
# Parse command-line arguments.
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
parents=[tools.argparser])
flags = parser.parse_args([])
flags.noauth_local_webserver = True
# Set up a Flow object to be used if we need to authenticate.
flow = client.flow_from_clientsecrets(
client_secrets_path, scope=scope,
prompt = 'consent',
message=tools.message_if_missing(client_secrets_path))
storage = file.Storage(api_name + '.dat')
credentials = storage.get()
if credentials is None or credentials.invalid:
credentials = tools.run_flow(flow, storage, flags)
http = credentials.authorize(http=httplib2.Http())
# Build the service object.
service = build(api_name, api_version, http=http)
return service
Затем я извлекаю данные из сервисного объекта с помощью вызовов, подобных этой:
def retrieveAcctList():
accountObj = GetService().accounts().list(
access_token = token).execute()
, которая запускает поток на моей локальной машине.
Любая помощь ценится!