本页面介绍如何使用凭证访问边界来创建具有缩小的 Cloud Storage 权限范围的 OAuth 2.0 访问令牌。
创建具有缩小的权限范围的令牌的过程包括以下步骤:
- 向用户或服务账号授予相应的 IAM 角色。
- 定义一个凭证访问边界,以设置用户或服务账号可用的权限的上限。
- 为用户或服务账号创建 OAuth 2.0 访问令牌。
- 将 OAuth 2.0 访问令牌交换为遵循凭证访问边界的新令牌。
然后,您可以使用具有缩小的权限范围的新 OAuth 2.0 访问令牌,验证针对 Cloud Storage 的请求的身份。
准备工作
在使用凭据访问边界之前,请确保满足以下要求:
您需要只针对 Cloud Storage 缩小权限范围,而不对其他Google Cloud 服务这样做。
如果您需要缩小针对其他 Google Cloud服务的权限范围,您可以创建多个服务账号并为每个服务账号授予一组不同的角色。
您可以使用 OAuth 2.0 访问令牌进行身份验证。 其他类型的短期有效凭证不支持凭证访问边界。
此外,您还必须启用所需的 API:
-
Enable the IAM and Security Token Service APIs.
授予 IAM 角色
凭据访问边界设置了可用于特定资源的权限的上限。它可以删减主账号已获取的权限,但无法添加该主账号尚未拥有的权限。
因此,您还必须在 Cloud Storage 存储桶上,或更高级别的资源(例如项目)上向主账号授予提供所需权限的角色。
例如,假设您需要创建一个具有缩小的权限范围的短期有效的凭据,以允许服务账号在存储桶中创建对象:
- 您必须至少向服务账号授予包含
storage.objects.create
权限的角色,例如 Storage Object Creator 角色 (roles/storage.objectCreator
)。凭据访问边界也必须包含此权限。 - 您还可以授予其包含更多权限的角色,例如 Storage Object Admin 角色 (
roles/storage.objectAdmin
)。服务账号只能使用同时出现在角色授权和凭据访问边界中的权限。
如需了解 Cloud Storage 的预定义角色,请参阅 Cloud Storage 角色。
定义凭证访问边界
凭据访问边界是包含一系列访问边界规则的对象。这些规则由参数组成,用于指定用户或服务账号可用的权限的上限。如需定义凭证访问边界,请创建一个列出访问边界规则及其参数的 JSON 对象。
以下是一个凭证访问边界的示例:
{
"accessBoundary": {
"accessBoundaryRules": [
{
"availablePermissions": [
"inRole:ROLE_ID"
],
"availableResource": "//storage.googleapis.com/projects/_/buckets/BUCKET_NAME"
"availabilityCondition": {
"expression" : "CONDITION"
}
]
}
}
替换以下内容:
ROLE_ID
:预定义角色或自定义角色的 ID,相应角色用于定义可用资源权限的上限。例如roles/storage.objectViewer
。如需指定多个角色,请添加一个以inRole:
为前缀后跟角色 ID 的新行。只能使用指定角色具有的权限。BUCKET_NAME
:相应规则所适用的 Cloud Storage 存储桶的名称。CONDITION
:可选。一个条件表达式,用于指定可以使用权限的 Cloud Storage 对象。例如,如果应用以下条件,则名称以customer-a
开头的对象可以使用权限:resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')
如需详细了解如何创建和自定义凭证访问边界,请参阅凭证访问边界的组成部分。
如需查看凭证访问边界的潜在应用场景示例,请参阅凭证访问边界的示例。
创建 OAuth 2.0 访问令牌
要创建具有缩小的权限范围的短期有效的凭据,您必须先创建一个常规的 OAuth 2.0 访问令牌。然后将常规凭据交换为具有缩小的权限范围的凭据。在创建访问令牌时,请使用 OAuth 2.0 范围 https://www.googleapis.com/auth/cloud-platform
。
要为服务账号创建访问令牌,您可以完成服务器到服务器的 OAuth 2.0 流程,或者可以使用 Service Account Credentials API 生成 OAuth 2.0 访问令牌。
如需为用户创建访问令牌,请参阅获取 OAuth 2.0 访问令牌。您还可以使用 OAuth 2.0 Playground,为您自己的 Google 账号创建访问令牌。
交换 OAuth 2.0 访问令牌
创建 OAuth 2.0 访问令牌后,您可以将访问令牌交换为符合凭据访问边界的缩小的权限范围的令牌。此过程通常涉及令牌代理和令牌使用方:
令牌代理负责定义凭据访问边界以及将访问令牌交换为具有缩小的权限范围的令牌。
令牌代理可以使用受支持的身份验证库自动交换访问令牌,也可以调用 Security Token Service 来手动交换令牌。
令牌使用方会从令牌代理请求具有缩小的权限范围的访问令牌,然后使用具有缩小的权限范围的访问令牌来执行其他操作。
令牌使用方可以使用受支持的身份验证库在访问令牌到期之前自动刷新访问令牌。或者,令牌使用方可以手动刷新令牌;也可以让令牌过期,而不进行刷新。
您可以通过以下两种方式将访问令牌交换为具有缩小权限范围的令牌:
客户端令牌交换(推荐):客户端从 Security Token Service API 服务器获取加密材料。借助加密材料,客户端可以在客户端上独立生成具有不同凭证访问边界规则的缩小权限范围的令牌,有效期为既定的一段时长(例如 1 小时)。这种方法可缩短延迟时间并提高效率,尤其适用于需要频繁更新凭证访问边界规则的客户端。对于需要生成多个具有缩小权限范围的唯一令牌的应用,这种方法更高效。我们建议您采用这种方法,因为它可提供更优异的性能、可扩缩性以及与未来功能的兼容性。
服务器端令牌交换:每当凭证访问边界规则发生更改时,客户端都会向 Security Token Service API 服务器请求具有缩小权限范围的新令牌。此方法简单明了,但每次请求具有缩小权限范围的令牌都需要往返 Security Token Service API 服务器。由于每次请求具有缩小权限范围的令牌都需要往返 Security Token Service API,因此建议仅在客户需要使用的客户端库不支持客户端令牌交换时才使用此方法。
客户端令牌交换
如果您使用以下编程语言创建令牌代理和令牌使用方,则可以使用 Google 的身份验证库通过客户端方法自动交换和刷新令牌。
Java
对于 Java,您可以使用 com.google.auth:google-auth-library-cab-token-generator
制品 1.32.1 版或更高版本自动交换和刷新令牌。
如需检查制品版本,请在应用目录中运行以下 Maven 命令:
mvn dependency:list -DincludeArtifactIds=google-auth-library-cab-token-generator
以下示例展示了令牌代理如何生成具有缩小的权限范围的令牌:
以下示例展示了令牌使用方如何使用刷新处理程序自动获取和刷新具有缩小的权限范围的令牌:
服务器端令牌交换
本部分介绍了以下方法,可用于通过服务端方法交换令牌:
使用服务器端方法自动交换和刷新访问令牌
如果您使用以下某种编程语言创建令牌代理和令牌使用方,则可以使用 Google 的身份验证库通过服务器端令牌生成方法自动交换和刷新令牌:
Go
对于 Go,您可以使用 golang.org/x/oauth2
软件包 v0.0.0-20210819190943-2bc19b11175f 版或更高版本自动交换和刷新令牌。
如需检查软件包版本,请在应用目录中运行以下命令:
go list -m golang.org/x/oauth2
以下示例展示了令牌代理如何生成具有缩小的权限范围的令牌:
以下示例展示了令牌使用方如何使用刷新处理程序自动获取和刷新具有缩小的权限范围的令牌:
Java
对于 Java,您可以使用 com.google.auth:google-auth-library-oauth2-http
制品 1.1.0 版或更高版本自动交换和刷新令牌。
如需检查制品版本,请在应用目录中运行以下 Maven 命令:
mvn dependency:list -DincludeArtifactIds=google-auth-library-oauth2-http
以下示例展示了令牌代理如何生成具有缩小的权限范围的令牌:
以下示例展示了令牌使用方如何使用刷新处理程序自动获取和刷新具有缩小的权限范围的令牌:
Node.js
对于 Node.js,您可以使用 google-auth-library
软件包 7.9.0 版或更高版本自动交换和刷新令牌。
如需检查软件包版本,请在应用目录中运行以下命令:
npm list google-auth-library
以下示例展示了令牌代理如何生成具有缩小的权限范围的令牌:
以下示例展示了令牌使用方如何提供自动获取和刷新具有缩小的权限范围的令牌的刷新处理程序:
Python
对于 Python,您可以使用 google-auth
软件包 2.0.0 版或更高版本自动交换和刷新令牌。
如需检查软件包版本,请在安装该软件包的环境中运行以下命令:
pip show google-auth
以下示例展示了令牌代理如何生成具有缩小的权限范围的令牌:
以下示例展示了令牌使用方如何提供自动获取和刷新具有缩小的权限范围的令牌的刷新处理程序:
手动交换和刷新访问令牌
令牌代理可以使用 Security Token Service API 将访问令牌交换为具有缩小的权限范围的访问令牌。然后,令牌代理可以向令牌使用方提供具有缩小的权限范围的令牌。
要交换访问令牌,请使用以下 HTTP 方法和网址:
POST https://sts.googleapis.com/v1/token
将请求中的 Content-Type
标头设置为 application/x-www-form-urlencoded
。在请求正文中添加以下字段:
字段 | |
---|---|
grant_type |
使用 |
options |
JSON 格式的凭证访问边界,采用百分号编码方法进行编码。 |
requested_token_type |
使用 |
subject_token |
您想要交换的 OAuth 2.0 访问令牌。 |
subject_token_type |
使用 |
响应是包含以下字段的 JSON 对象:
字段 | |
---|---|
access_token |
符合凭据访问边界的具有缩小的权限范围的 OAuth 2.0 访问令牌。 |
expires_in |
具有缩小的权限范围的令牌到期前的时间量(以秒为单位)。 仅当原始访问令牌代表服务账号时才会包括此字段。如果不包括此字段,则具有缩小权限范围的令牌的到期时间与原始访问令牌的到期时间相同。 |
issued_token_type |
包含 |
token_type |
包含 |
例如,如果 JSON 格式的凭证访问边界存储在 ./access-boundary.json
文件中,您可以使用以下 curl
命令交换访问令牌。将 original-token
替换为原始访问令牌:
curl -H "Content-Type:application/x-www-form-urlencoded" \ -X POST \ https://sts.googleapis.com/v1/token \ -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange&subject_token_type=urn:ietf:params:oauth:token-type:access_token&requested_token_type=urn:ietf:params:oauth:token-type:access_token&subject_token=original-token" \ --data-urlencode "options=$(cat ./access-boundary.json)"
响应类似于以下示例:
{
"access_token": "ya29.dr.AbCDeFg-123456...",
"issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
"token_type": "Bearer",
"expires_in": 3600
}
当令牌使用方请求具有缩小权限范围的令牌时,令牌代理的响应中会同时包含相应具有缩小权限范围的令牌以及该令牌距离到期的时间(秒数)。如果令牌已到期,服务器会拒绝该请求。如需刷新具有缩小权限范围的令牌,使用方可以在现有令牌到期之前从代理请求具有缩小权限范围的令牌。
后续步骤
- 了解 Cloud Storage 的访问权限控制。
- 创建短期有效的服务账号凭据。
- 通过以下任一方法为服务账号创建 OAuth 2.0 访问令牌:
- 为用户创建 OAuth 2.0 访问令牌。
- 查看每个预定义角色中的权限。
- 了解自定义角色。