Java中Google Cloud访问令牌自定义过期时间不生效如何解决?
问题
我正在使用Java获取Google Cloud的Downscoped访问令牌,代码如下(忽略非必要配置):
GoogleCredentials sourceCredentials = ServiceAccountCredentials.fromStream(serviceAccountStream); DownscopedCredentials downscopedCredentials = DownscopedCredentials.newBuilder() .setSourceCredential(sourceCredentials) .setCredentialAccessBoundary(credentialAccessBoundary) .build(); AccessToken accessToken = downscopedCredentials.refreshAccessToken();
默认返回的令牌expires_in为3599秒(1小时),我尝试将其修改为300秒,于是给源凭证添加了.createWithCustomLifetime(300):
GoogleCredentials sourceCredentials = ServiceAccountCredentials.fromStream(serviceAccountStream) .createWithCustomLifetime(300);
此时服务账号JWT的payload中exp字段已成功设置为iat + 300,但返回的访问令牌响应仍显示:
{ "access_token": "$token_response", "expires_in": 3599 }
请问如何让expires_in变为300秒?
原因
你给源服务账号凭证设置的createWithCustomLifetime仅修改了源JWT自身的过期时间,这个JWT只是用来向Google令牌服务请求Downscoped令牌的"凭证",它的有效期不会传递给最终生成的Downscoped访问令牌。Downscoped令牌的默认有效期由Google服务控制,默认是1小时。
解决方案
要设置Downscoped访问令牌的有效期,需要在构建DownscopedCredentials时,通过setTokenLifetime方法指定持续时间,而不是修改源凭证的生命周期。修改后的代码如下:
import java.time.Duration; // ... GoogleCredentials sourceCredentials = ServiceAccountCredentials.fromStream(serviceAccountStream); DownscopedCredentials downscopedCredentials = DownscopedCredentials.newBuilder() .setSourceCredential(sourceCredentials) .setCredentialAccessBoundary(credentialAccessBoundary) .setTokenLifetime(Duration.ofSeconds(300)) // 指定Downscoped令牌有效期为300秒 .build(); AccessToken accessToken = downscopedCredentials.refreshAccessToken();
注意事项
- Google Cloud对Downscoped令牌的有效期有范围限制:最小60秒,最大3600秒(1小时),300秒在合法范围内。
- 源服务账号JWT的有效期需要大于等于Downscoped令牌的有效期,否则会在请求令牌时报错。如果你的源JWT默认有效期是1小时,无需额外修改,已经满足要求;如果之前修改过源JWT的有效期为300秒,也没问题,刚好匹配Downscoped令牌的有效期。
内容的提问来源于stack exchange,提问作者Nutcracker
相关产品推荐
相关产品推荐

