App Engine OAuth2.0授权cron作业来分析Google表格

时间:2017-02-11 22:48:27

标签: python google-app-engine oauth-2.0

我正在创建一个Google App Engine项目,该项目将每隔5分钟自动触发一次功能来分析Google表格。

OAuth授权

待分析表格是G Suite表格,仅供公司成员使用。所以我需要OAuth2来授权访问权限。我该怎么做?

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

我需要一些指示。

由于

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

2 个答案:

答案 0 :(得分:1)

是的,它是OAuth2流程,但不涉及手动用户操作 - 这些操作由服务器根据预先配置的信息自动执行。从您提到的文件:

  

Google OAuth 2.0系统支持服务器到服务器的互动   例如Web应用程序和Google服务之间的那些。为了这   您需要一个服务帐户的场景,该帐户属于一个帐户   到您的应用程序而不是单个最终用户。您的   应用程序代表服务帐户调用Google API,因此   用户不直接参与。有时会调用此方案   "双腿OAuth,"或" 2LO。" (相关术语"三足OAuth"   指的是您的应用程序在其上调用Google API的方案   代表最终用户,有时需要用户同意。)

基本上你需要:

  

要将域范围的权限委派给服务帐户,请先启用   服务中现有服务帐户的域范围委派   帐户页面或在域范围内创建新的服务帐户   授权已启用。

     

然后,G Suite域的管理员必须完成   以下步骤:

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

    您的应用程序现在有权以用户身份进行API调用   您的域名("模仿"用户)。当你准备做   授权的API调用,您指定用户进行模拟。

答案 1 :(得分:0)

最后我这样解决了:

  • 设置一个新的App Engine服务帐户(我不知道是否真的需要“新”服务帐户)
  • 记下新服务帐户电子邮件
  • 与该服务帐户邮件共享工作表(我尚未在没有此步骤的情况下对其进行测试)
  • 以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