开发者社区> 问答> 正文

获取到了SecurityToken 还是上传不成功

已解决

展开
收起
2018-05-22 19:12:06 4671 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    详细解答可以参考官方帮助文档

    使用STS进行临时授权

    OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问。阿里云STS是为云计算用户提供临时访问令牌的Web服务。通过STS,您可以为第三方应用或子用户(即用户身份由您自己管理的用户)颁发一个自定义时效和权限的访问凭证。STS更详细的解释请参见STS介绍

    STS的优势如下:

    • 您无需透露您的长期密钥(AccessKey)给第三方应用,只需生成一个访问令牌并将令牌交给第三方应用。您可以自定义这个令牌的访问权限及有效期限。

    • 您无需关心权限撤销问题,访问令牌过期后自动失效。

    使用STS访问OSS的流程请参见开发指南中的RAM和STS应用场景实践

    使用STS凭证构造签名请求

    以下代码用于使用STS凭证构造签名请求:

    1. // Endpoint以杭州为例,其它Region请按实际情况填写。
    2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    4. String accessKeyId = "<yourAccessKeyId>";
    5. String accessKeySecret = "<yourAccessKeySecret>";
    6. String securityToken = "<yourSecurityToken>";
    7. // 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
    8. // 创建OSSClient实例。
    9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
    10. // OSS操作。
    11. // 关闭OSSClient。
    12. ossClient.shutdown();

    使用签名URL进行临时授权

    生成签名URL

    您可以将生成的签名URL提供给访客进行临时访问。生成签名URL时,您可以指定URL的过期时间,来限制访客的访问时长。

    生成以GET方法访问的签名URL

    以下代码用于生成以GET方法访问的签名URL:

    1. // Endpoint以杭州为例,其它Region请按实际情况填写。
    2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    4. String accessKeyId = "<yourAccessKeyId>";
    5. String accessKeySecret = "<yourAccessKeySecret>";
    6. String bucketName = "<yourBucketName>";
    7. String objectName = "<yourObjectName>";
    8. // 创建OSSClient实例。
    9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    10. // 设置URL过期时间为1小时。
    11. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
    12. // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
    13. URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration);
    14. // 关闭OSSClient。
    15. ossClient.shutdown();

    生成以其他HTTP方法访问的签名URL

    如果您想允许访客临时进行其他操作(比如上传或删除文件),需要生成对应的签名URL,例如使用生成PUT的签名URL上传文件:

    1. // Endpoint以杭州为例,其它Region请按实际情况填写。
    2. String endpoint = "oss-cn-hangzhou.aliyuncs.com";
    3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    4. String accessKeyId = "<yourAccessKeyId>";
    5. String accessKeySecret = "<yourAccessKeySecret>";
    6. String securityToken = "<yourSecurityToken>";
    7. String bucketName = "<yourBucketName>";
    8. String objectName = "<yourObjectName>";
    9. // 用户拿到STS临时凭证后,通过其中的安全令牌(SecurityToken)和临时访问密钥(AccessKeyId和AccessKeySecret)生成OSSClient。
    10. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret, securityToken);
    11. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
    12. // 设置URL过期时间为1小时。
    13. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
    14. request.setExpiration(expiration);
    15. // 设置ContentType。
    16. request.setContentType(DEFAULT_OBJECT_CONTENT_TYPE);
    17. // 设置自定义元信息。
    18. request.addUserMetadata("author", "aliy");
    19. // 生成PUT方式的签名URL。
    20. URL signedUrl = ossClient.generatePresignedUrl(request);
    21. Map<String, String> requestHeaders = new HashMap<String, String>();
    22. requestHeaders.put(HttpHeaders.CONTENT_TYPE, DEFAULT_OBJECT_CONTENT_TYPE);
    23. requestHeaders.put(OSS_USER_METADATA_PREFIX + "author", "aliy");
    24. // 使用签名URL上传文件。
    25. ossClient.putObject(signedUrl, new ByteArrayInputStream("Hello OSS".getBytes()), -1, requestHeaders, true);
    26. // 关闭OSSClient。
    27. ossClient.shutdown();

    通过传入HttpMethod.PUT参数,访客可以使用生成的签名URL上传文件。

    生成指定参数的签名URL

    以下代码用于生成指定参数的签名URL:

    1. // Endpoint以杭州为例,其它Region请按实际情况填写。
    2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    4. String accessKeyId = "<yourAccessKeyId>";
    5. String accessKeySecret = "<yourAccessKeySecret>";
    6. String bucketName = "<yourBucketName>";
    7. String objectName = "<yourObjectName>";
    8. // 创建OSSClient实例。
    9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    10. // 创建请求。
    11. GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
    12. // HttpMethod为PUT。
    13. generatePresignedUrlRequest.setMethod(HttpMethod.PUT);
    14. // 添加用户自定义元信息。
    15. generatePresignedUrlRequest.addUserMetadata("author", "baymax");
    16. // 添加Content-Type。
    17. generatePresignedUrlRequest.setContentType("application/octet-stream");
    18. // 设置URL过期时间为1小时。
    19. Date expiration = new Date(new Date().getTime() + 3600 * 1000);
    20. generatePresignedUrlRequest.setExpiration(expiration);
    21. // 生成签名URL。
    22. URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
    23. // 关闭OSSClient。
    24. ossClient.shutdown();

    使用签名URL上传/获取文件

    使用签名URL获取文件

    以下代码用于使用签名URL获取指定文件:

    1. // Endpoint以杭州为例,其它Region请按实际情况填写。
    2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    4. String accessKeyId = "<yourAccessKeyId>";
    5. String accessKeySecret = "<yourAccessKeySecret>";
    6. String bucketName = "<yourBucketName>";
    7. String objectName = "<yourObjectName>";
    8. // 创建OSSClient实例。
    9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    10. Date expiration = DateUtil.parseRfc822Date("Wed, 18 Mar 2022 14:20:00 GMT");
    11. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
    12. // 设置过期时间。
    13. request.setExpiration(expiration);
    14. // 生成签名URL(HTTP GET请求)。
    15. URL signedUrl = ossClient .generatePresignedUrl(request);
    16. System.out.println("signed url for getObject: " + signedUrl);
    17. // 使用签名URL发送请求。
    18. Map<String, String> customHeaders = new HashMap<String, String>();
    19. // 添加GetObject请求头。
    20. customHeaders.put("Range", "bytes=100-1000");
    21. OSSObject object = ossClient.getObject(signedUrl,customHeaders);
    22. // 关闭OSSClient。
    23. ossClient.shutdown();

    使用签名URL上传文件

    以下代码用于使用签名URL上传文件:

    1. // Endpoint以杭州为例,其它Region请按实际情况填写。
    2. String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    3. // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
    4. String accessKeyId = "<yourAccessKeyId>";
    5. String accessKeySecret = "<yourAccessKeySecret>";
    6. String bucketName = "<yourBucketName>";
    7. String objectName = "<yourObjectName>";
    8. // 创建OSSClient实例。
    9. OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    10. // 生成签名URL。
    11. Date expiration = DateUtil.parseRfc822Date("Thu, 19 Mar 2019 18:00:00 GMT");
    12. GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.PUT);
    13. // 设置过期时间。
    14. request.setExpiration(expiration);
    15. // 设置Content-Type。
    16. request.setContentType("application/octet-stream");
    17. // 添加用户自定义元信息。
    18. request.addUserMetadata("author", "aliy");
    19. // 生成签名URL(HTTP PUT请求)。
    20. URL signedUrl = ossClient.generatePresignedUrl(request);
    21. System.out.println("signed url for putObject: " + signedUrl);
    22. // 使用签名URL发送请求。
    23. File f = new File("<yourLocalFile>");
    24. FileInputStream fin = new FileInputStream(f);
    25. // 添加PutObject请求头。
    26. Map<String, String> customHeaders = new HashMap<String, String>();
    27. customHeaders.put("Content-Type", "application/octet-stream");
    28. customHeaders.put("x-oss-meta-author", "aliy");
    29. PutObjectResult result = ossClient.putObject(signedUrl, fin, f.length(), customHeaders);
    30. // 关闭OSSClient。
    31. ossClient.shutdown();
    2018-05-29 15:08:24
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
附件下载测试 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载