如何以编程方式创建Google Apps用户帐户

时间:2014-09-19 23:15:23

标签: google-oauth google-apps google-admin-sdk

我的组织(波兰童军协会)拥有自己的谷歌应用程序域名,每个童子军都有一个电子邮件地址。

我们决定创建一个用户可以授权的WWW应用程序,并设置自己的谷歌应用程序帐户。要做到这一点,我们需要一个编程,非交互式的方式来创建谷歌应用程序帐户。

要明确:

  1. 用户使用我们在整个组织中使用的凭据登录我们的应用程序
  2. 他发起了谷歌应用帐户创建
  3. 我们的应用程序创建了他的谷歌应用程序帐户
  4. 这可以使用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可以实现吗?

2 个答案:

答案 0 :(得分:2)

您是对的,创建用户的当前方式是Admin SDK Directory API。

好消息是,当你确实需要OAUth凭证时,你不需要人来每次来授权请求​​。您只需将凭据存储在应用程序中,以便每次都可以执行所需的操作。

您有两种选择:

  • 执行OAuth手动授权,并将凭据存储在文件或数据库中。凭证只是两个称为访问令牌和刷新令牌的字符串。请注意,授权必须由超级管理员用户提供,以便应用可以创建用户。

  • 使用服务帐户和domain wide delegation 授权您的应用模拟任何用户,然后模拟超级管理员用户执行目录API操作。

我相信第一个选项对你来说会更简单。

在任何情况下,您最终会得到一个访问令牌,有效期为1小时。此访问令牌将授予您的应用程序访问API的权限。一小时后,您需要获得一个新的刷新令牌,这取决于您选择的选项。

如果您选择执行一次手动操作,则会获得刷新令牌。该刷新令牌永远有效,并且用于刷新访问令牌。实际上,这只意味着您获得了一个新的访问令牌。

如果您选择了服务帐户选项,则只需从服务帐户的私钥重新生成访问令牌。

请注意,在这两种情况下,Google的OAuth 2 Python库(Admin SDK库都需要)将为您处理刷新工作。

答案 1 :(得分:1)

@David回答让我走上正轨,但是我在使用服务帐户方面遇到了一些问题。

解决方案

我决定使用服务帐户和模拟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.对您的代码执行域范围的授权。

  
      
  1. 转到您的Google Apps域管理控制台。
  2.   
  3. 从控件列表中选择安全性。如果您没有看到列出的安全性,请从底部的灰色栏中选择更多控件   页面,然后从控件列表中选择安全性。
  4.   
  5. 从选项列表中选择高级设置。
  6.   
  7. 在“身份验证”部分中选择管理第三方OAuth客户端访问。
  8.   
  9. 在客户名称字段中输入服务帐户的客户ID。
  10.   
  11. 在“一个或多个API范围”字段中,输入应授予您的应用程序访问权限的范围列表(请参见下图)。对于   例如,如果您需要全域访问Google Drive API和   Google Calendar API输入:https://www.googleapis.com/auth/drive,   https://www.googleapis.com/auth/calendar   单击“授权”按钮。
  12.   

请注意,您需要在步骤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])
  • 其中1是服务帐户的电子邮件地址,2是您网域中 admin 用户的现有地址。从现在开始,API将采用此操作(由2标记)用户授权和凭据执行所有操作。
  • 请注意,1在步骤5中包含Email Address服务帐户(与客户ID不同)。

现在您应该拥有API的读写帐户。