逗老师带你学ITGoogle Admin服务账号+API管理G suit内所有网域用户

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逗老师带你学ITGoogle Admin服务账号+API管理G suit内所有网域用户相关的知识,希望对你有一定的参考价值。

本文主要介绍使用Google API服务账号和Google Admin管理G suit内所有网域用户。主要技术点在

Google API 服务账号申请
Google OAuth 2.0认证获取token
Google Admin内对API应用授权

@TOC

一、Google API服务账号申请

1、注册Google Cloud Platform平台

访问https://console.developers.google.com
初次使用GCP(Google Cloud Platform)的用户会自动弹出注册页面
技术图片

2、新建GCP开发者项目

在API信息中心标题栏,点击“组织”按钮,然后点击新建项目。
技术图片

3、启用Admin SDK

新项目建立完成后,进入项目的信息中心,点击“+启用API和服务
技术图片
在搜索栏搜索Admin,可以快速检索到Admin SDK
技术图片
点击“启用”
技术图片

4、申请Google API服务账号

在API和服务控制台内,点击“凭据”,“+创建凭据”,“服务账号
技术图片
技术图片
技术图片
在创建服务账号的第三步,下载密钥私钥文件,是一个JSON格式的秘钥,用于服务账号的鉴权。
技术图片
记得保存好此秘钥,后面用得到,并且不要分享到Github等公开场合。
技术图片
创建完成后,点击账号名称进入账号管理,启用G suit全网与委派功能。一旦启用此功能后,OAuth2.0客户端处会自动生成用于管理G suit
技术图片
技术图片
至此,记录下API OAuth2.0客户端ID,后面用得到。

二、G Suit控制台授权API服务账号管理

1、添加API OAuth2.0客户端ID至G Suit

登录https://admin.google.com
技术图片
往后翻,找到高级设置,点击管理API客户端访问权限
技术图片
客户端名称部分,添加刚才创建API服务账号时生成的客户端ID,作用域部分,填写Google OAuth2.0身份认证里提供的scope作用域URL。
例如本利中,我们需要管理G Suit所有网域下的所有用户,因此本利的scope作用域

View and manage the provisioning of users on your domain:
https://www.googleapis.com/auth/admin.directory.user

技术图片

2、关于Scope作用域

对于不同功能的API请求,在请求开始前的OAuth2.0认证阶段,就需要提供scope来请求token。对于获取的token,也仅具备访问此Scope作用域的权限。
Google API中涉及的做用户请见下文链接:
Directory API: Authorize Requests
以及,在开发文档中,每个功能的详细介绍中都会注明该功能需要请求的scope
技术图片

3、G Suit内授权服务账号管理用户的权限

API服务账号和Scope作用域约束的是API调用权限,没有这两个先决条件,API接口都没法正常运行。
但是,因为我们本例中调用的API最终实现的是管理G Suit内所有用户。因此还需要在G Suit的权限体系下为API授权。
(Google内部的权限划分真特么的细致)
通过OAuth2.0之后,有两种方式可以使服务账户具备全网域账号的管理权限。

1、授权API应用可管理全部用户。
2、创建一个G Suit用户管理员账户,之后API调用时委派身份为此账户。

实话说,别看第一种方式听起来简单,实际操作时,委派身份的方式反而更简单。

3.1 授权API应用可管理全部用户。

此方法截图太长了,仅文字描述

1)访问G Suit控制台->安全性->设置->API权限->应用访问权限控制->管理第三方应用的访问权限->添加应用->OAuth应用名称或客户端ID
2)输入API OAuth2.0客户端ID,点击搜索
3)如果输入的客户端ID正确,可以查找到之前创建的API认证客户端
4)点击添加按钮,添加API应用.
5)找到刚刚添加的应用,点击右侧,Change Access,配置为受信任。

3.2、通过委派管理员身份的方式获取管理员权限

在获取OAuth2.0阶段的credentials是,使用.with_subject方法委派一个具备管理权限的用户身份即可。
技术图片

三、API接口调用范例

1、Google SDK Python开发环境安装

pip安装Google提供的SDK包

pip install google-api-python-client
pip install google-ads
pip install oauth2client

2、Google SDK Github仓库地址

Google APIs Client Library for Python

3、Google Admin SDK文档

首页>产品>G Suite Developer>Admin SDK>Directory API>参考>API Reference

4、Google OAuth 2.0文档

首页>产品>Google Identity Platform>指南>Using OAuth 2.0 to Access Google APIs

5、本例中的范例代码

#coding=utf-8
import datetime
import os
import re
import sys
import time
import requests
import httplib2
from googleapiclient.discovery import build
from google.oauth2 import service_account

SCOPES = [‘https://www.googleapis.com/auth/admin.directory.user‘]
SERVICE_ACCOUNT_FILE = ‘./account_manager_service_account_cc97f7d70a741.json‘
#授权空间(scope)和授权秘钥
#授权的JSON文件,参见第一章节第4节中申请服务账号时创建的JSON秘钥文件。

class APIrequest:

    def get_credentials():
        credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
        #授权应用访问G suit控制台,获取授权信息
        credentials = credentials.with_subject(‘admin@csdn.com‘)
        #委派管理员权限
        return credentials
    def get_user_data(credentials,userKey_in):
    #获取用户信息
        try:
            service = build("admin", "directory_v1", credentials=credentials)
            results = service.users().get(userKey=userKey_in).execute()
        except Exception as err:
            raise err
        else:
            return results

    def update_user_password(credentials,userKey_in,password_in):
        try:
            update_data={"password": password_in,"changePasswordAtNextLogin": "true"}
            service = build("admin", "directory_v1", credentials=credentials)
            results = service.users().update(userKey=userKey_in,body=update_data).execute()
        except Exception as err:
            raise err
        else:
            return results

    def suspend_user(credentials,userKey_in):
        try:
            update_data={"suspended": "true"}
            service = build("admin", "directory_v1", credentials=credentials)
            results = service.users().update(userKey=userKey_in,body=update_data).execute()
        except Exception as err:
            raise err
        else:
            return results

    def add_user(credentials,primaryEmail,familyName,givenName,password):
        try:
            insert_data={
                "name": {
                    "familyName": familyName,
                    "givenName": givenName,
                    },
                 "password": password,
                 "primaryEmail": primaryEmail,
                 "changePasswordAtNextLogin": "true"
                }
            service = build("admin", "directory_v1", credentials=credentials)
            results = service.users().insert(body=insert_data).execute()
        except Exception as err:
            raise err
        else:
            return results

def main():
    sys.argv[1]=‘suspend_user‘
    sys.argv[2]=‘newuser@csdn.com‘
    sys.argv[3]=‘P@ssw0rd123123123444‘
    sys.argv[4]=‘new‘
    sys.argv[5]=‘user‘
    method=sys.argv[1]
    credentials=APIrequest.get_credentials()
    try:
        if method=="update_password":
            userKey=sys.argv[2]
            password=sys.argv[3]
            APIrequest_get_data=APIrequest.update_user_password(credentials,userKey,password)
            #print(APIrequest_get_data)
        if method=="get_user_info":
            userKey=sys.argv[2]
            APIrequest_get_data=APIrequest.get_user_data(credentials,userKey)
            print(APIrequest_get_data)
        if method=="suspend_user":
            userKey=sys.argv[2]
            APIrequest_get_data=APIrequest.suspend_user(credentials,userKey)
            #print(APIrequest_get_data)
        if method=="add_user":
            primaryEmail=sys.argv[2]
            password=sys.argv[3]
            familyName=sys.argv[4]
            givenName=sys.argv[5]
            APIrequest_get_data=APIrequest.add_user(credentials,primaryEmail,familyName,givenName,password)
            #print(APIrequest_get_data)
    except Exception as err:
        print(err)
    else:
        print("200:OK")

if __name__ == ‘__main__‘:
    main()

6、API返回数据

Google API返回JSON格式数据,例如本例中查询用户信息,会获取以下信息。
JSON具体字段解释:
Google Admin SDK | Users Resource representations
技术图片
往期回顾:
【逗老师带你学IT】PRTG监控系统通过企业微信推送图文混排告警消息
【逗老师带你学IT】PRTG HTTP API获取指定传感器流量图表图片
【逗老师带你学IT】PRTG监控系统合并多个传感器通道数据
【逗老师带你学IT】PRTG监控系统通过企业微信推送告警消息
【逗老师带你学IT】PRTG监控系统配合树莓派采集企业内部无线网络质量
【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动
【逗老师带你学IT】Kiwi Syslog Server安装和配置教程
【逗老师带你学IT】Kiwi Syslog Web Access与Active Directory集成认证
【逗老师带你学IT】vMware ESXi 6.7合并第三方硬件驱动
【逗老师带你学IT】Windows Server Network Policy Service(NPS)记账与审计
【逗老师带你学IT】Windows Server NPS服务构建基于AD域控的radius认证
【逗老师带你学IT】AD域控和freeradius集成认证环境,PAP,MSCHAPV2
【逗老师带你学IT】深信服SSL远程接入与深信服行为审计同步登陆用户信息

以上是关于逗老师带你学ITGoogle Admin服务账号+API管理G suit内所有网域用户的主要内容,如果未能解决你的问题,请参考以下文章

逗老师带你学ITWindows Server NPS服务构建基于AD域控的radius认证

逗老师带你学ITPRTG HTTP API获取指定传感器流量图表图片

逗老师带你学ITAD域控 Dsquery 查询命令实例汇总

逗老师带你学ITZoomRooms兼容硬件设计方案

逗老师带你学ITPRTG监控系统通过企业微信推送告警消息

清华师哥 每周 花6 小时带你学 Java:JVM高并发多线程算法微服务等。薪资咔咔咔往上涨!