sts使用URL签名授权访问
详细解答可以参考官方帮助文档使用STS进行临时授权OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。STS更详细的解释请参见STS介绍。
STS的优势如下:
您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用。您可以自定义这个令牌的访问权限及有效期限。
您无需关心权限撤销问题,访问令牌过期后自动失效。
使用STS访问OSS的流程请参见开发指南中的RAM和STS应用场景实践。
使用STS凭证构造签名请求以下代码用于使用STS凭证构造签名请求:
// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = 'http://oss-cn-hangzhou.aliyuncs.com';// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = '';String accessKeySecret = '';String securityToken = '';// 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。// 创建OSSClient实例。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);// OSS操作。// 关闭OSSClient。ossClient.shutdown();
使用签名URL进行临时授权生成签名URL您可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以指定URL的过期时间,来限制访客的访问时长。
生成以GET方法访问的签名URL以下代码用于生成以GET方法访问的签名URL:
// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = 'http://oss-cn-hangzhou.aliyuncs.com';// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = '';String accessKeySecret = '';String bucketName = '';String objectName = '';// 创建OSSClient实例。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 设置URL过期时间为1小时。Date expiration = new Date(new Date().getTime() + 3600 * 1000);// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);// 关闭OSSClient。ossClient.shutdown();
生成以其他HTTP方法访问的签名URL如果您想允许访客临时进行其他操作(比如上传或删除文件),需要生成对应的签名URL,例如使用生成PUT的签名URL上传文件:
// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = 'oss-cn-hangzhou.aliyuncs.com';// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = '';String accessKeySecret = '';String securityToken = '';String bucketName = '';String objectName = '';// 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);// 设置URL过期时间为1小时。Date expiration = new Date(new Date().getTime() + 3600 * 1000);request.setExpiration(expiration);// 设置ContentType。request.setContentType(DEFAULT_OBJECT_CONTENT_TYPE);// 设置自定义元信息。request.addUserMetadata('author', 'aliy');// 生成PUT方式的签名URL。URL signedUrl = ossClient.generatePresignedUrl(request);MapString, String> requestHeaders = new HashMapString, String>();requestHeaders.put(HttpHeaders.CONTENT_TYPE, DEFAULT_OBJECT_CONTENT_TYPE);requestHeaders.put(OSS_USER_METADATA_PREFIX + 'author', 'aliy');// 使用签名URL上传文件。ossClient.putObject(signedUrl, new ByteArrayInputStream('Hello OSS'.getBytes()), -1, requestHeaders, true);// 关闭OSSClient。ossClient.shutdown();
通过传入HttpMethod.PUT参数,访客可以使用生成的签名URL上传文件。
生成指定参数的签名URL以下代码用于生成指定参数的签名URL:
// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = 'http://oss-cn-hangzhou.aliyuncs.com';// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = '';String accessKeySecret = '';String bucketName = '';String objectName = '';// 创建OSSClient实例。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 创建请求。GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);// HttpMethod为PUT。generatePresignedUrlRequest.setMethod(HttpMethod.PUT);// 添加用户自定义元信息。generatePresignedUrlRequest.addUserMetadata('author', 'baymax');// 添加Content-Type。generatePresignedUrlRequest.setContentType('application/octet-stream');// 设置URL过期时间为1小时。Date expiration = new Date(new Date().getTime() + 3600 * 1000);generatePresignedUrlRequest.setExpiration(expiration);// 生成签名URL。URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);// 关闭OSSClient。ossClient.shutdown();
使用签名URL上传/获取文件使用签名URL获取文件以下代码用于使用签名URL获取指定文件:
// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = 'http://oss-cn-hangzhou.aliyuncs.com';// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = '';String accessKeySecret = '';String bucketName = '';String objectName = '';// 创建OSSClient实例。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);Date expiration = DateUtil.parseRfc822Date('Wed, 18 Mar 2022 14:20:00 GMT');GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);// 设置过期时间。request.setExpiration(expiration);// 生成签名URL(HTTP GET请求)。URL signedUrl = ossClient .generatePresignedUrl(request);System.out.println('signed url for getObject: ' + signedUrl);// 使用签名URL发送请求。MapString, String> customHeaders = new HashMapString, String>();// 添加GetObject请求头。customHeaders.put('Range', 'bytes=100-1000');OSSObject object = ossClient.getObject(signedUrl,customHeaders);// 关闭OSSClient。ossClient.shutdown();
使用签名URL上传文件以下代码用于使用签名URL上传文件:
// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = 'http://oss-cn-hangzhou.aliyuncs.com';// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。String accessKeyId = '';String accessKeySecret = '';String bucketName = '';String objectName = '';// 创建OSSClient实例。OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);// 生成签名URL。Date expiration = DateUtil.parseRfc822Date('Thu, 19 Mar 2019 18:00:00 GMT');GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);// 设置过期时间。request.setExpiration(expiration);// 设置Content-Type。request.setContentType('application/octet-stream');// 添加用户自定义元信息。request.addUserMetadata('author', 'aliy');// 生成签名URL(HTTP PUT请求)。URL signedUrl = ossClient.generatePresignedUrl(request);System.out.println('signed url for putObject: ' + signedUrl);// 使用签名URL发送请求。File f = new File('');FileInputStream fin = new FileInputStream(f);// 添加PutObject请求头。MapString, String> customHeaders = new HashMapString, String>();customHeaders.put('Content-Type', 'application/octet-stream');customHeaders.put('x-oss-meta-author', 'aliy');PutObjectResult result = ossClient.putObject(signedUrl, fin, f.length(), customHeaders);// 关闭OSSClient。ossClient.shutdown();
赞0
踩1