Как получить экран Google Oauth для загрузки в окне приложения Flask на Heroku - PullRequest
0 голосов
/ 07 апреля 2020

Я создаю приложение Python Flask, которое собирает некоторую информацию об учетной записи Google Tag Manager (GTM) пользователя. Для этого мне нужно, чтобы они авторизовали доступ только для чтения к своей учетной записи GTM, а затем я go и получил нужные мне данные.

Идеальный поток здесь:

  1. Пользователь нажимает кнопку "войти в систему с помощью Google"
  2. Открывается новая вкладка, предлагающая ему выбрать свою учетную запись Google
  3. На следующей странице рассказывается, какие разрешения я ищу, и разрешить доступ.
  4. Они принимают, поток аутентификации завершен, и вкладка закрывается.

Мне удалось запустить приложение локально с нужным потоком, без проблем.

Однако, как только я развернул его в 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()

, которая запускает поток на моей локальной машине.

Любая помощь ценится!

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