google-cloud-platform - GCP - 将服务帐户模拟为用户
问题描述
我想允许用户模拟服务帐户对长时间运行的进程进行操作。但是,所有代码示例都说明了一个服务帐户模拟另一个服务帐户。
用户可以直接模拟服务帐号吗?如果是这样,怎么做?
我正在关注这个示例代码。
初始化一个无权访问列表存储桶的源凭证:
from google.oauth2 import service_acccount
target_scopes = [
'https://www.googleapis.com/auth/devstorage.read_only']
source_credentials = (
service_account.Credentials.from_service_account_file(
'/path/to/svc_account.json',
scopes=target_scopes))
现在使用源凭据获取凭据以模拟另一个服务帐户:
from google.auth import impersonated_credentials
target_credentials = impersonated_credentials.Credentials(
source_credentials=source_credentials,
target_principal='impersonated-account@_project_.iam.gserviceaccount.com',
target_scopes = target_scopes,
lifetime=500)
解决方案
不要尝试从用户帐户模拟服务帐户,而是授予用户创建服务帐户 OAuth 访问令牌的权限。
授予用户roles/iam.serviceAccountTokenCreator
服务帐户的角色。
调用 APIgenerateAccessToken
以从服务帐户创建访问令牌。
projects.serviceAccounts.generateAccessToken
一个简单的 HTTP POST 请求将返回一个访问令牌。使用服务帐户电子邮件地址修改以下请求。
POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE-ACCOUNT-NAME@PROJECTID.iam.gserviceaccount.com:generateAccessToken
请求正文:
{
"delegates": [],
"scope": [
"https://www.googleapis.com/auth/cloud-platform"
],
"lifetime": "3600s"
}
此 API 需要授权。在 HTTP 授权标头中包含用户的 OAuth 访问令牌。
Authorization: Bearer ACCESS_TOKEN
回复正文:
{
"accessToken": "eyJ0eXAifeA...NiK8i",
"expireTime": "2020-03-05T15:01:00.12345678Z"
}
推荐阅读
- leaflet - Leaflet - 自定义平铺层 - 获取经纬度坐标
- python - 如何像圆圈一样遍历列表?
- dart - Flutter web - Window.history.pushState 不起作用
- c# - C# 使用 SharpZipLib 将文本文件 (.GetInputStream()) 从存档解压缩为字符串
- python-3.x - 在 Python 中的 Scrapy 中导入模块时出错
- java - 拜托,如果我们想在主方法之外的方法中使用它,你能告诉我第二次声明扫描器类对象的原因吗?
- css - 不同项目文件夹中的 SCSS 文件被编译成一个 CSS 文件
- javascript - 当我在 JS fike 中添加 CSS 类时,它没有运行
- c# - Asp.net Core 3.1 MVC - 在开发环境中禁用身份验证
- r - R如何按行值分组,拆分或子集