是否可以在不代表域范围委托中的用户的情况下从服务帐户调用 API?
Is it possible to call APIs from service account without acting on behalf of a user in domain-wide delegation?
我的 Python 脚本从 G Suite 中检索有关用户和组的信息(目前正在测试,使用 14 天免费帐户)。我正在为服务器到服务器应用程序使用全域委派和 OAuth 2.0,因为我不想显示一个弹出窗口 window,托管域中的用户允许我查看他们的组和用户。
这些是我为获取用户和组而遵循的步骤:
- 创建并下载所有必要的凭据,例如客户端 ID;
- 从我的 G Suite 管理控制台,允许访问我的客户端 ID 并授予它访问用户和组的权限 API 具有与我的脚本相同的范围;
- 在我的脚本中,使用 .json 创建凭据并代表 G Suite 管理员发出请求;
- 开始呼叫 APIs.
现在,G Suite 管理员已经在其安全设置中允许某个客户端 ID 的某些范围:这是我手工制作的,手动输入客户端 ID 和范围.在 OAuth 2.0 for Server to Server Applications 教程中,它显示为:
If you have delegated domain-wide access to the service account and you want to impersonate a user account, use the with_subject method of an existing service_account.Credentials object.
所以:我允许自己从 G 套件管理面板访问某些 APIs,我的脚本创建了使用该 APIs 的凭据,但我下载的 .json 不是够了:似乎在域范围内委托我的脚本仍然代表来自该托管域的用户发出请求,在我的例子中是托管域的管理员。我试图创建凭据 wihtout 冒充用户,但我没有足够的权限这样做,并且调用 APIs returns me 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 面板向您要模拟的用户授予特定的读写权限,以便能够访问您的组和用户。
我的 Python 脚本从 G Suite 中检索有关用户和组的信息(目前正在测试,使用 14 天免费帐户)。我正在为服务器到服务器应用程序使用全域委派和 OAuth 2.0,因为我不想显示一个弹出窗口 window,托管域中的用户允许我查看他们的组和用户。
这些是我为获取用户和组而遵循的步骤:
- 创建并下载所有必要的凭据,例如客户端 ID;
- 从我的 G Suite 管理控制台,允许访问我的客户端 ID 并授予它访问用户和组的权限 API 具有与我的脚本相同的范围;
- 在我的脚本中,使用 .json 创建凭据并代表 G Suite 管理员发出请求;
- 开始呼叫 APIs.
现在,G Suite 管理员已经在其安全设置中允许某个客户端 ID 的某些范围:这是我手工制作的,手动输入客户端 ID 和范围.在 OAuth 2.0 for Server to Server Applications 教程中,它显示为:
If you have delegated domain-wide access to the service account and you want to impersonate a user account, use the with_subject method of an existing service_account.Credentials object.
所以:我允许自己从 G 套件管理面板访问某些 APIs,我的脚本创建了使用该 APIs 的凭据,但我下载的 .json 不是够了:似乎在域范围内委托我的脚本仍然代表来自该托管域的用户发出请求,在我的例子中是托管域的管理员。我试图创建凭据 wihtout 冒充用户,但我没有足够的权限这样做,并且调用 APIs returns me 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 面板向您要模拟的用户授予特定的读写权限,以便能够访问您的组和用户。