我的组织(波兰童军协会)拥有自己的谷歌应用程序域名,每个童子军都有一个电子邮件地址。
我们决定创建一个用户可以授权的WWW应用程序,并设置自己的谷歌应用程序帐户。要做到这一点,我们需要一个编程,非交互式的方式来创建谷歌应用程序帐户。
要明确:
这可以使用Google Data API来完成,不推荐使用。另一种方式似乎是通过Google Admin directory API,但根据文档,需要物理人类用户使用Oauth2授权请求。
在以下示例中提出了流程:
flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE, REDIRECT_URI)
authorize_url = flow.step1_get_authorize_url()
print 'Go to the following link in your browser: ' + authorize_url
code = raw_input('Enter verification code: ').strip()
credentials = flow.step2_exchange(code)
似乎我需要使用OAuth2 scheme,其中(我猜)暗示一些具有管理员权限的活人授权每个请求,在我们的例子中,我们显然希望用户能够初始化帐户创建。
使用此(或任何其他)API可以实现吗?
答案 0 :(得分:2)
您是对的,创建用户的当前方式是Admin SDK Directory API。
好消息是,当你确实需要OAUth凭证时,你不需要人来每次来授权请求。您只需将凭据存储在应用程序中,以便每次都可以执行所需的操作。
您有两种选择:
执行OAuth手动授权,并将凭据存储在文件或数据库中。凭证只是两个称为访问令牌和刷新令牌的字符串。请注意,授权必须由超级管理员用户提供,以便应用可以创建用户。
使用服务帐户和domain wide delegation 授权您的应用模拟任何用户,然后模拟超级管理员用户执行目录API操作。
我相信第一个选项对你来说会更简单。
在任何情况下,您最终会得到一个访问令牌,有效期为1小时。此访问令牌将授予您的应用程序访问API的权限。一小时后,您需要获得一个新的刷新令牌,这取决于您选择的选项。
如果您选择执行一次手动操作,则会获得刷新令牌。该刷新令牌永远有效,并且用于刷新访问令牌。实际上,这只意味着您获得了一个新的访问令牌。
如果您选择了服务帐户选项,则只需从服务帐户的私钥重新生成访问令牌。
请注意,在这两种情况下,Google的OAuth 2 Python库(Admin SDK库都需要)将为您处理刷新工作。
答案 1 :(得分:1)
我决定使用服务帐户和模拟API,请注意这样可以提供对您的应用程序的高级访问权限,并且可以提高安全性!
无论如何,这是你需要做的:
Follow this tutorial,但在设置凭据时创建服务帐户
这是页面的重要部分:
(...)您可以在开发人员中自行激活Admin SDK 控制台执行以下操作:
- 转到Google Developers Console。
- 选择一个项目,或创建一个新项目。
- 在左侧边栏中,展开API& AUTH。接下来,单击API。在API列表中,确保Admin SDK的状态为ON。
- 在左侧边栏中,选择凭据。
- 在任何一种情况下,您最终都会进入“凭据”页面,并可以从此处创建项目凭据。
如果您还没有这样做,请创建您的OAuth 2.0凭据 单击OAuth标题下的“创建新客户端ID”。接下来,寻找 您的应用程序的相关表中的客户端ID和客户端密钥 您还可以从此页面创建和编辑重定向URI。
使用this guide.对您的代码执行域范围的授权。
- 转到您的Google Apps域管理控制台。
- 从控件列表中选择安全性。如果您没有看到列出的安全性,请从底部的灰色栏中选择更多控件 页面,然后从控件列表中选择安全性。
- 从选项列表中选择高级设置。
- 在“身份验证”部分中选择管理第三方OAuth客户端访问。
- 在客户名称字段中输入服务帐户的客户ID。
- 在“一个或多个API范围”字段中,输入应授予您的应用程序访问权限的范围列表(请参见下图)。对于 例如,如果您需要全域访问Google Drive API和 Google Calendar API输入:https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar 单击“授权”按钮。
醇>
请注意,您需要在步骤5中提供Client ID
而不是Email Address
。
请参阅list of scopes。
安装google-api-python-client,PyCrypto和PyOpenSSL(你可以省略PyOpenSSL),但是你需要转换下载的证书。
with open('private/key-filename.p12', 'rb') as f:
private_key = f.read()
credentials = SignedJwtAssertionCredentials(
'user-email-@developer.gserviceaccount.com', # Email address [1]
private_key,
'https://www.googleapis.com/auth/admin.directory.user',
sub="impersonated-user@foo.bar" # Impersonate user [2])
Email Address
服务帐户(与客户ID不同)。现在您应该拥有API的读写帐户。