2017-02-11 11 views
0

Я создаю проект Google App Engine, который будет автоматически запускать функцию каждые 5 минут для анализа листа Google.App Engine OAuth2.0 разрешено задание cron для анализа Листа Google

авторизации OAuth

чтобы быть проанализирован лист представляет собой набор листов G, чтобы общественность только члены компании. Поэтому мне нужно, чтобы OAuth2 разрешал доступ. Как мне это сделать?

Мне кажется, мне нужен идентификатор клиента учетной записи службы, потому что, поскольку это будет запускаться автоматически на сервере, поток OAuth2 не может быть, не так ли? Кто будет нажимать кнопки, если функция запущена на сервере?

Мне нужно несколько направлений.

Благодаря

https://developers.google.com/identity/protocols/OAuth2ServiceAccount

ответ

0

Наконец я решил это так:

  • Настройка новой учетной записи службы двигателя App (я не знаю, если «новый» один был neccesary действительно)
  • принять к сведению, что новый service account email
  • Поделитесь листом с этой учетной записью учетной записи службы (я еще не протестировал ее без этого шага)
  • Загрузите свои сервисные секреты как JSON.
  • Используйте этот код (вдохновленный в (1) и (2))

    class analysisHandler(Handler): 
        def get(self): 
    
         credentials = ServiceAccountCredentials.from_json_keyfile_name('service-secrets.json', 
              ["https://www.googleapis.com/auth/spreadsheets"]) 
    
         http = httplib2.Http() 
    
         #if credentials are still valid 
         if not credentials.invalid: 
          logging.info("Valid credentials, entering main function") 
          http = credentials.authorize(http) 
          main(http) 
         else: 
          credentials.refresh(http) 
          main(http) 
    

Тогда в основной():

sheetService = discovery.build('sheets', 'v4', http=authorized_http) 
logging.info("Reading Google Sheet") 
result = sheetService.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range_name).execute(http=authorized_http) 

urlfetch.set_default_fetch_deadline(45) 
logging.info("Printing in Google Sheet") 
sheetService.spreadsheets().values().append(spreadsheetId=spreadsheet_id, range="Log", body=body, valueInputOption="USER_ENTERED").execute(http=authorized_http) 

Если параметр authorized_http является один построен до с credentials.authorize()

Я думаю, что это может быть улучшено, однако.

(1) How to use "Service account" authorization (rather than user based access refresh tokens)

(2) Creating and sharing Google Sheet spreadsheets using Python

+0

Но вы понимаете, что при таком подходе электронная таблица перестает быть «общедоступной только для членов компании» (поскольку она разделяется с внешним сущностью), правильно? –

+0

О да, с учетной записью службы, спасибо за указание. Это будет работать. – mclzc

1

Да, это поток OAuth2, но не один, с участием ручной работы пользователя - действия выполняются на серверах, автоматически, основываясь на предварительно сконфигурированной информации. С самого документа вы упомянули:

Система Google OAuth 2.0 поддерживает сервер-сервер взаимодействиями например, между веб-приложением и службой Google. Для этого сценария вам потребуется учетная запись службы, которая относится к к вашему приложению, а не к конечному пользователю. Ваше приложение вызывает API Google от имени учетной записи службы, поэтому пользователи напрямую не участвуют. Этот сценарий иногда называют «двуногим OAuth» или «2LO». (. Родственный термин «три ноги OAuth» относится к ситуации, в которых приложение вызывает API Google, на имени конечных пользователей, а также, в которых иногда требуется согласие пользователя)

В основном вам нужно:

  • на стороне GAE, чтобы найти существующий (или создать новую) учетную запись службы для приложения (в IAM & администратора Service Accounts страницы облачного проекта). Одна учетная запись службы автоматически создается при создании вашего приложения.

  • на стороне G Suite, чтобы разрешить доступ Delegating domain-wide authority to the service account:

Чтобы делегировать общедоменное полномочие учетной записи службы первого включением общедоменной делегации для существующей учетной записи службы в Service или создать новую учетную запись службы с включенной делегией домена .

Затем администратор домена G Suite, необходимо выполнить следующие действия :

  1. Перейти к консоли администратора G Сюита домена.
  2. Выберите «Безопасность» в списке элементов управления.Если вы не видите «Безопасность», выберите «Дополнительные элементы управления» на серой панели внизу страницы, затем выберите «Безопасность» в списке элементов управления. Если вы не видите элементы управления, убедитесь, что вы вошли в систему как администратор для домена.
  3. Выберите Показать больше, а затем Расширенные настройки из списка параметров.
  4. Выберите «Управление доступом к API-интерфейсу» в разделе «Аутентификация».
  5. В поле «Имя клиента» введите идентификатор клиента учетной записи службы. Вы можете найти идентификатор клиента своей учетной записи службы в Service accounts page.
  6. В поле «Одно или несколько полей API» введите список областей, к которым должен быть предоставлен доступ к вашему приложению. Например, если вашему приложению необходим доступ по всему домену к API Диска Google и API календаря Google, введите: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.
  7. Нажмите «Авторизовать».

Ваше приложение теперь имеет право совершать вызовы API в качестве пользователей в вашего домена (для «олицетворения» пользователей). Когда вы готовитесь к совершению авторизационных вызовов API , вы указываете, что пользователь должен выдать себя за другое.

+0

Большое спасибо, но мне интересно, если есть способ, чтобы избежать вовлечения G Сюита Администратор ... Я на самом деле практически не иметь доступ к нему. – mclzc

+0

Я не думаю, что это возможно, так как в G Suite используется контроль доступа к документу. –

+0

Я, наконец, сделал это без решения домена, я все еще царапаю себе голову, но он работает. Выложите решение. Спасибо за вашу помощь. – mclzc