2017-02-11 67 views
0

我正在创建一个Google App引擎项目,每隔5分钟自动触发一个函数来分析Google工作表。App引擎OAuth2.0授权的cron作业分析Google工作表

OAuth授权

的待分析的片是G套房片,公共仅公司成员。所以我需要OAuth2来授权访问。我该怎么做呢?

我想我需要一个服务帐户客户端ID,因为这是要在服务器上自动运行,不能有OAuth2流,对吧?如果该功能在服务器中运行,谁将点击按钮?

我需要一些指导。

由于

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

回答

0

最后我解决这样说:

  • 安装新的App Engine服务帐户(我不知道,如果一个“新”之一是neccesary真的)
  • 注意到,新的服务帐户电子邮件
  • 与该服务帐户邮件共享表(我还没有测试过没有这一步)
  • 将其服务机密作为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) 
    

然后在main():

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流程,却没有一个涉及的手动用户操作 - 该动作由服务器执行的,自动的基础上预先配置的信息。从你说的很文档:

的谷歌的OAuth 2.0系统支持服务器到服务器交互 如Web应用程序和谷歌的服务之间。对于此 方案,您需要一个服务帐户,该帐户属于 而不是个人最终用户。您的 应用程序代表服务帐户调用Google API,因此 用户不直接参与。这种情况有时被称为 “双腿OAuth”或“2LO”。 (相关术语“三向OAuth” 是指在应用程序调用上 代表最终用户的谷歌的API,并在用户同意的,有时是需要的场景)

基本上你需要:

要委派域范围内的授权服务帐户,第一使能 域范围委派在现有服务帐户服务 帐户页面或创建一个新的服务帐户,并启用域的 委派。

然后,摹套房域的管理员必须完成 以下步骤:

  1. 转到你的Google+套房域的管理控制台。
  2. 从控件列表中选择安全性。如果您未看到安全列表,请从页面底部 的灰色条中选择更多控件,然后从控件列表中选择安全性。如果您的 无法看到这些控件,请确保您是以域名管理员 的身份登录的。
  3. 选择显示更多选项,然后从选项列表中选择高级设置。
  4. 在验证部分选择管理API客户端访问。
  5. 在客户端名称字段中输入服务帐户的客户端ID。您可以在Service accounts page中找到您的服务帐户的客户端ID。
  6. 在一个或多个API范围字段中,输入您的应用程序应被授予访问权限的范围列表。例如,如果您的 应用程序需要对Google Drive API和 Google Calendar API进行域范围访问,请输入:https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar
  7. 点击授权。

您的应用程序现在有权以域名 (“模仿”用户)为用户进行API调用。当您准备制作 授权的API调用时,可以指定用户模拟。

+0

非常感谢你,但我不知道是否有办法避免涉及摹套房管理员......其实我几乎不有权访问它。 – mclzc

+0

我不认为这是可能的,因为在G Suite中,文档访问控制是强制执行的。 –

+0

我终于在没有域名解决方案的情况下做到了这一点,我仍然在挠头,但它的工作原理。将发布解决方案。谢谢你的帮助。 – mclzc