我正在创建一个Google App Engine项目,该项目将每隔5分钟自动触发一次功能来分析Google表格。
OAuth授权
待分析表格是G Suite表格,仅供公司成员使用。所以我需要OAuth2来授权访问权限。我该怎么做?
我认为我需要一个服务帐户客户端ID,因为这将在服务器中自动运行,因此不能有OAuth2流,对吧?如果在服务器中运行该功能,谁将要点击按钮?
我需要一些指示。
由于
https://developers.google.com/identity/protocols/OAuth2ServiceAccount
答案 0 :(得分:1)
是的,它是OAuth2流程,但不涉及手动用户操作 - 这些操作由服务器根据预先配置的信息自动执行。从您提到的文件:
Google OAuth 2.0系统支持服务器到服务器的互动 例如Web应用程序和Google服务之间的那些。为了这 您需要一个服务帐户的场景,该帐户属于一个帐户 到您的应用程序而不是单个最终用户。您的 应用程序代表服务帐户调用Google API,因此 用户不直接参与。有时会调用此方案 "双腿OAuth,"或" 2LO。" (相关术语"三足OAuth" 指的是您的应用程序在其上调用Google API的方案 代表最终用户,有时需要用户同意。)
基本上你需要:
为您的应用找到现有(或创建新的)服务帐户(在云项目的IAM和管理员Service Accounts页面中)。创建应用时会自动创建一个服务帐户。
允许Delegating domain-wide authority to the service account访问:
要将域范围的权限委派给服务帐户,请先启用 服务中现有服务帐户的域范围委派 帐户页面或在域范围内创建新的服务帐户 授权已启用。
然后,G Suite域的管理员必须完成 以下步骤:
- 转到G Suite域的管理控制台。
- 从控件列表中选择安全性。如果您没有看到列出的安全性,请从底部的灰色栏中选择更多控件 页面,然后从控件列表中选择安全性。如果你 无法查看控件,请确保您以管理员身份登录 对于域名。
- 从选项列表中选择显示更多,然后选择高级设置。
- 在“身份验证”部分中选择“管理API客户端访问”。
- 在“客户名称”字段中输入服务帐户的客户端ID。您可以在Service accounts page。
中找到您的服务帐户的客户ID- 在“一个或多个API范围”字段中,输入应授予应用程序访问权限的范围列表。例如,如果你的 应用程序需要在域范围内访问Google Drive API和 Google Calendar API,请输入:https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar。
- 点击授权。
醇>您的应用程序现在有权以用户身份进行API调用 您的域名("模仿"用户)。当你准备做 授权的API调用,您指定用户进行模拟。
答案 1 :(得分:0)
最后我这样解决了:
使用此代码(灵感来自(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