标签:pre 查找 vpd 文档 采集 自动 sub authorize 认证客户
本文主要介绍使用Google API服务账号和Google Admin管理G suit内所有网域用户。主要技术点在Google API 服务账号申请
Google OAuth 2.0认证获取token
Google Admin内对API应用授权
@TOC
访问https://console.developers.google.com
初次使用GCP(Google Cloud Platform)的用户会自动弹出注册页面
在API信息中心标题栏,点击“组织”按钮,然后点击新建项目。
新项目建立完成后,进入项目的信息中心,点击“+启用API和服务
”
在搜索栏搜索Admin,可以快速检索到Admin SDK
点击“启用”
在API和服务控制台内,点击“凭据
”,“+创建凭据
”,“服务账号
”
在创建服务账号的第三步,下载密钥私钥文件,是一个JSON格式的秘钥,用于服务账号的鉴权。
记得保存好此秘钥,后面用得到,并且不要分享到Github等公开场合。
创建完成后,点击账号名称进入账号管理,启用G suit全网与委派功能
。一旦启用此功能后,OAuth2.0客户端处会自动生成用于管理G suit
至此,记录下API OAuth2.0客户端ID,后面用得到。
登录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
对于不同功能的API请求,在请求开始前的OAuth2.0认证阶段,就需要提供scope来请求token。对于获取的token,也仅具备访问此Scope作用域的权限。
Google API中涉及的做用户请见下文链接:
Directory API: Authorize Requests
以及,在开发文档中,每个功能的详细介绍中都会注明该功能需要请求的scope
API服务账号和Scope作用域约束的是API调用权限,没有这两个先决条件,API接口都没法正常运行。
但是,因为我们本例中调用的API最终实现的是管理G Suit内所有用户。因此还需要在G Suit的权限体系下为API授权。
(Google内部的权限划分真特么的细致)
通过OAuth2.0之后,有两种方式可以使服务账户具备全网域账号的管理权限。
1、授权API应用可管理全部用户。
2、创建一个G Suit用户管理员账户,之后API调用时委派身份为此账户。
实话说,别看第一种方式听起来简单,实际操作时,委派身份的方式反而更简单。
此方法截图太长了,仅文字描述
1)访问G Suit控制台->安全性->设置->API权限->应用访问权限控制->管理第三方应用的访问权限->添加应用->OAuth应用名称或客户端ID
2)输入API OAuth2.0客户端ID,点击搜索
3)如果输入的客户端ID正确,可以查找到之前创建的API认证客户端
4)点击添加按钮,添加API应用.
5)找到刚刚添加的应用,点击右侧,Change Access,配置为受信任。
在获取OAuth2.0阶段的credentials是,使用.with_subject
方法委派一个具备管理权限的用户身份即可。
pip安装Google提供的SDK包
pip install google-api-python-client
pip install google-ads
pip install oauth2client
Google APIs Client Library for Python
首页>产品>G Suite Developer>Admin SDK>Directory API>参考>API Reference
首页>产品>Google Identity Platform>指南>Using OAuth 2.0 to Access Google APIs
#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()
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远程接入与深信服行为审计同步登陆用户信息
【逗老师带你学IT】Google Admin服务账号+API管理G suit内所有网域用户
标签:pre 查找 vpd 文档 采集 自动 sub authorize 认证客户
原文地址:https://blog.51cto.com/1737585/2549115