阿里云OSS设置STSTOKEN失效时间为当前RAM角色会话时间12小时
最近项目涉及到了js直接传OSS以及从OSS下载,只通过后端拿ststoken,然后在前端直接封装ossclient对象来进行操作,其中有个批量下载的场景,但是ststoken的有效期min到max为15分到1小时,生成的签名url的有效期可指定但是取俩者最小的,导致批量下载的话浏览器下载到最后url可能会过期。使用以下方法生成12小时的ststoken:
DefaultProfile profile = DefaultProfile.getProfile(regionId,accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setDurationSeconds(43200L);
try {
StsInfoDto stsInfoDto = new StsInfoDto();
AssumeRoleResponse response = client.getAcsResponse(request);
stsInfoDto.setExpiration(response.getCredentials().getExpiration());
stsInfoDto.setAccesskeyid(response.getCredentials().getAccessKeyId());
stsInfoDto.setAccesskeysecret(response.getCredentials().getAccessKeySecret());
stsInfoDto.setSecuritytoken(response.getCredentials().getSecurityToken());
stsInfoDto.setRequestid(response.getRequestId());
stsInfoDto.setRegion(region);
stsInfoDto.setBucket(bucket);
log.info(DateTimeUtils.getNowDateStr("yyyy-MM-dd HH:mm:ss")+"Expiration:{} Access Key Id:{}" +
"Access Key Secret:{} Security Token:{} RequestId:{}",stsInfoDto.getExpiration(),stsInfoDto.getAccesskeyid(),
stsInfoDto.getAccesskeysecret(),stsInfoDto.getSecuritytoken(),stsInfoDto.getRequestid());
commonRes.setRespCode(CommonErrorCode.C000000000.code);
commonRes.setRespData(stsInfoDto);
return commonRes;
} catch (Exception e) {
log.error(DateTimeUtils.getNowDateStr("yyyy-MM-dd HH:mm:ss")+"ststoken获取失败:"+JSON.toJSONString(e));
commonRes.setRespCode(CommonErrorCode.E999999999.code);
commonRes.setRespMsg("ststoken获取失败");
return commonRes;
}
里面涉及的配置就不多说了,以下附上js通过上面的token生成12小时过期的签名url的方法,可以修改文件名称同时指定url的过期时间:
<!--name0就是你想重命名的名称 ulr0就是你oss里文件的路径和名称
url1就是签名生成的12小时才过期的文件下载路径-->
var response = {
'content-disposition': `attachment; filename=${encodeURIComponent(name0)}`
}
var url_1 = client.signatureUrl(url0, { expires: 43200,response });
let iframe = document.createElement('iframe')
iframe.src = url_1
iframe.style.display = 'none'
document.body.appendChild(iframe);
|