是否可以从服务帐号调用 API,而无需在全网域委派中代表用户执行操作?



我的 Python 脚本从 G Suite 中检索有关用户和群组的信息(目前使用 14 天免费帐户进行测试)。我正在对服务器到服务器应用程序使用域范围的委派和 OAuth 2.0,因为我不想显示一个弹出窗口,托管域中的用户将允许我查看他们的组和用户。

这些是我为了获取用户和组而遵循的步骤:

  1. 创建并下载所有必要的凭据,例如客户端 ID;
  2. 在我的 G Suite 管理控制台中,允许访问我的客户端 ID,并授予其访问与我的脚本范围相同的用户和群组 API 的权限;
  3. 在我的脚本中,使用 .json 创建凭据并代表 G Suite 管理员发出请求;
  4. 开始调用 API。

现在,G Suite管理员必须在其安全设置中允许某个客户端ID的某些范围:这是我手动制作的,手动输入客户端ID和范围。在用于服务器到服务器应用程序的OAuth 2.0教程中,它写道:

如果您已委派对服务帐号的全网域访问权限,并且想要模拟用户帐户,请使用现有service_account的 with_subject 方法。凭据对象。

所以:我给了自己从 G Suite 管理面板访问某些 API 的权限,我的脚本创建了使用该 API 的凭据,但我下载的 .json 还不够:似乎通过全域委派,我的脚本仍然必须代表来自该托管域的用户发出请求,在我的情况下是托管域的管理员。我尝试创建模拟用户的凭据,但我没有足够的权限来执行此操作,并且对 API 的调用返回我 401 或 403。

我认为委托访问权限不需要代表用户执行操作,因为服务帐户不与任何用户关联。

是否可以在不模拟属于我正在使用的托管域的用户的情况下为服务帐户创建凭据?我的客户端ID和包含我的私钥和其他东西的.json文件还不够吗?

这是我的代码:

from google.oauth2 import service_account
import googleapiclient.discovery
import json
""" CONSTANTS AND GLOBAL VARIABLES
"""
# The API we request to use
SCOPES = ['https://www.googleapis.com/auth/admin.directory.group.readonly',
'https://www.googleapis.com/auth/admin.directory.user.readonly']
# json containing keys, account service email, id client and other stuff
SERVICE_ACCOUNT_FILE = 'my_file.json'
# The hosted domain we want to work with
DOMAIN = 'some_hd.it'
# The user I'm using to create credentials
USER_EMAIL = 'name.surname@some_hd.it'

""" SETTING AND GETTING CREDENTIALS
"""
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
if credentials is None:
print "BAD CREDENTIALS"
delegated_credentials = credentials.with_subject(USER_EMAIL)
"""
build('api_name', 'api_version', ...)
https://developers.google.com/api-client-library/python/apis/
"""
service = googleapiclient.discovery.build('admin', 'directory_v1',
credentials=delegated_credentials)

""" GETTING GROUPS AND USERS
"""
request = service.groups().list(domain=DOMAIN)
response = request.execute()
groups = response.get('groups', [])
if not groups:
print "No groups in %s" % (DOMAIN)
print
request = service.users().list(domain=DOMAIN)
response = request.execute()
users = response.get('users', [])
if not users:
print "No users in %s" % (DOMAIN)
else:
for user in users:
for email in user['emails']:
print email['address']
print 'User ID: %s' % (user['id'])
print 'Is admin? %s' % (str(user['isAdmin']))
print

我已经使用 Google API 一段时间了,我们有相同的场景,不,据我所知,你需要模拟。

请注意,仅允许 API、下载凭据并向客户端 ID 授予范围权限是不够的。

对于目录 API 等某些服务,您需要向要从管理 gsuite 面板模拟的用户授予特定的读取和写入权限,以便能够访问您的组和用户。

最新更新