Java 如何为生成安全的URL
我正在使用Java SDK将项目上传到Amazon S3。我上传的一些项目需要是公共的,我可以通过公共URL访问,而其他一些项目则需要是私有的。请检查下面的代码Java 如何为生成安全的URL,java,amazon-web-services,servlets,amazon-s3,jwt,Java,Amazon Web Services,Servlets,Amazon S3,Jwt,我正在使用Java SDK将项目上传到Amazon S3。我上传的一些项目需要是公共的,我可以通过公共URL访问,而其他一些项目则需要是私有的。请检查下面的代码 public class FileUpload { public static int PUBLIC = 1; public static int PRIVATE = 2; public void UploadObjectSingleOperation(String bucketName, InputStre
public class FileUpload {
public static int PUBLIC = 1;
public static int PRIVATE = 2;
public void UploadObjectSingleOperation(String bucketName, InputStream inputStream, String fileName, int privacy) {
String keyName = "xxxxxxxxxxx";
String secret = "xxxxxxxxxxxxxxxxxxxxxxxxx";
BasicAWSCredentials creds = new BasicAWSCredentials(keyName, secret);
AmazonS3 s3client=null;
if(privacy==PUBLIC)
{
s3client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).withRegion(Regions.AP_SOUTH_1).build();
}
else if(privacy==PRIVATE)
{
s3client = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(creds)).build();
}
try {
System.out.println("Uploading a new object to S3 from a file\n");
s3client.putObject(new PutObjectRequest(bucketName, fileName, inputStream,null).withCannedAcl(CannedAccessControlList.PublicRead));
} catch (AmazonServiceException ase) {
System.out.println("Caught an AmazonServiceException, which "
+ "means your request made it "
+ "to Amazon S3, but was rejected with an error response"
+ " for some reason.");
System.out.println("Error Message: " + ase.getMessage());
System.out.println("HTTP Status Code: " + ase.getStatusCode());
System.out.println("AWS Error Code: " + ase.getErrorCode());
System.out.println("Error Type: " + ase.getErrorType());
System.out.println("Request ID: " + ase.getRequestId());
} catch (AmazonClientException ace) {
System.out.println("Caught an AmazonClientException, which "
+ "means the client encountered "
+ "an internal error while trying to "
+ "communicate with S3, "
+ "such as not being able to access the network.");
System.out.println("Error Message: " + ace.getMessage());
}
}
}
对于私有对象,如何获得安全的URL,比如“标记化”URL?这意味着,URL存在,但需要一些特殊验证才能“工作”或“允许访问”,因此除了我的应用程序之外,不是每个人都可以访问URL。我该怎么做
我在S3中查看了
签名URL
,但它只设置了过期日期/时间。我的URL不需要过期,但需要一些访问验证 上传到s3后,您需要使用s3client通过bucket/key请求对象的预签名url
:
预签名URL的有效期最长为七天,因为您在签名计算中使用的签名密钥的有效期最长为七天
AWS文档提供了一个示例,说明如何:
上传到s3后,需要使用s3client通过bucket/key请求对象的预签名url : 预签名URL的有效期最长为七天,因为您在签名计算中使用的签名密钥的有效期最长为七天 AWS文档提供了一个示例,说明如何:
嗨,Ryan,正如我在问题中提到的,签名的URL也可以被任何人访问,我正在寻找一种机制,其中S3需要以某种方式“验证”URL访问。这些私有URL的内容将在android应用程序中为“付费用户”显示,我不希望他们以某种方式获取URL并将其交给尚未付款的人。@PeakGen-啊,好的,我在这里为另一个用户回答了这个问题:-这个过程相当于使用Amazon Cognito,因此只有你的应用程序的用户才能访问特定的存储桶,而且它甚至避免了需要预先签名的URL。即使您不需要用户登录到您的appHi Ryan,这也可以实现,正如我在问题中提到的,任何人都可以访问已签名的URL,我正在寻找一种机制,其中S3需要以某种方式“验证”URL访问。这些私有URL的内容将在android应用程序中为“付费用户”显示,我不希望他们以某种方式获取URL并将其交给尚未付款的人。@PeakGen-啊,好的,我在这里为另一个用户回答了这个问题:-这个过程相当于使用Amazon Cognito,因此只有你的应用程序的用户才能访问特定的存储桶,而且它甚至避免了需要预先签名的URL。即使您不要求用户登录到您的应用程序中,此功能也能正常工作
AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider());
java.util.Date expiration = new java.util.Date();
long msec = expiration.getTime();
msec += 1000 * 60 * 60; // 1 hour.
expiration.setTime(msec);
GeneratePresignedUrlRequest generatePresignedUrlRequest =
new GeneratePresignedUrlRequest(bucketName, objectKey);
generatePresignedUrlRequest.setMethod(HttpMethod.GET); // Default.
generatePresignedUrlRequest.setExpiration(expiration);
URL s = s3client.generatePresignedUrl(generatePresignedUrlRequest);