Запрос HTTPS API AWS S3 (URL), подписанный с временными учетными данными безопасности для доступа к объекту

Как сгенерировать запрос HTTPS API (URL), подписанный с временными учетными данными безопасности, для доступа к объекту AWS S3. Я могу получить доступ к объекту с помощью amazon java sdk, но я хотел бы сгенерировать полный URL-адрес с временными учетными данными безопасности, такими как предварительно подписанный URL. пакет com.siriusxm.repo.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import com.amazonaws.auth.BasicSessionCredentials;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient;
import com.amazonaws.services.securitytoken.model.Credentials;
import com.amazonaws.services.securitytoken.model.GetSessionTokenRequest;
import com.amazonaws.services.securitytoken.model.GetSessionTokenResult;
import com.siriusxm.repo.DownloadServiceImpl;

public class TemporaryCredential {

    private static String bucketName = "myrepo"; 
    private static String key  =  "test.pdf";

    public static void main(String[] args) {
        System.out.println("");

        AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient(
                new ProfileCredentialsProvider());
    //  stsClient.setRegion(regionName);sts.us-west-2.amazonaws.com
        //
        // Start a session.
        GetSessionTokenRequest getSessionTokenRequest = new GetSessionTokenRequest();
        GetSessionTokenResult sessionTokenResult = stsClient
                .getSessionToken(getSessionTokenRequest);
        Credentials sessionCredentials = sessionTokenResult.getCredentials();
        System.out.println("Session Credentials: "
                + sessionCredentials.toString());
        // Package the session credentials as a BasicSessionCredentials
        // object for an S3 client object to use.
        BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials(
                sessionCredentials.getAccessKeyId(),
                sessionCredentials.getSecretAccessKey(),
                sessionCredentials.getSessionToken());

        AmazonS3Client s3object = new AmazonS3Client(basicSessionCredentials);
        // Test. For example, get object keys for a given bucket.
        ObjectListing objects = s3object.listObjects(bucketName);
        s3object.getObject( new GetObjectRequest(bucketName, key));
        System.out.println("No. of Objects = "
                + objects.getObjectSummaries().size());
    }
}

Этот код генерирует ключ динамического доступа, секретный ключ и токен безопасности. Теперь мне нужно сгенерировать URL-адрес с заголовком авторизации с подписью, чтобы я мог напрямую обращаться к объекту S3. Есть ли способ?

Из этого кода я хочу сгенерировать URL-адрес, используя x-amz-security-token


person user1488378    schedule 21.01.2016    source источник


Ответы (1)


если вы хотите сделать это в Java, вам нужно использовать AmazonS3. сгенерироватьPresignedUrl

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); 

если вы хотите сделать это из консоли, перейдите в корзину s3, нажмите «Загрузить» на объекте. Отобразится окно, в котором вы можете нажать «скачать». Если вы щелкните правой кнопкой мыши эту ссылку и скопируете адресную ссылку, вы получите предварительно подписанный URL-адрес для этого объекта.

person Tom    schedule 21.01.2016
comment
@Tom-Я хочу сгенерировать URL-адрес с помощью STS, используя следующий код: AWSSecurityTokenServiceClient stsClient = new AWSSecurityTokenServiceClient (new ProfileCredentialsProvider()); Как сгенерировать URL-адрес https, используя временные учетные данные безопасности, используя x-amz-security-token. Пожалуйста, помогите - person user1488378; 21.01.2016
comment
STS — это веб-служба, которая позволяет вам запрашивать временные учетные данные для пользователей IAM или федеративных пользователей, но это не способ получить предварительно подписанный URL-адрес для s3. Что вы можете сделать, так это: сначала использовать sts для получения временных учетных данных IAM (с политикой, позволяющей получать объекты из s3), а затем предварительно подписать URL-адреса с помощью generatePresignedUrl, как показано в моем ответе, используя эти временные учетные данные. Обратите внимание, что предварительно подписанный URL-адрес действует временно и использует временные учетные данные за кулисами. - person Tom; 21.01.2016
comment
если необходимо, вот как создать клиента с временными учетными данными: AmazonS3Client s3 = новый AmazonS3Client(basic_session_creds); - person Tom; 21.01.2016
comment
@Tom-Я сгенерировал временные учетные данные, такие как ключ доступа, секретный ключ и токен безопасности. Пожалуйста, найдите прикрепленный код.. Теперь мне нужно сгенерировать URL-адрес, используя эти учетные данные с заголовком авторизации с подписью - person user1488378; 21.01.2016
comment
почему бы вам просто не добавить, как я предлагаю в моем ответе? вы можете распечатать URL-адрес, просто выполнив System.out.println(url is + s); где s является переменной, как описано в моем ответе. Я неправильно понимаю ваши потребности? - person Tom; 21.01.2016
comment
Я хочу аутентифицировать свой https-запрос с использованием временных учетных данных, не генерируя предварительно подписанный URL-адрес. Поскольку запрос Authentiacte с использованием временных учетных данных и предварительно подписанного URL-адреса — это две разные вещи. Я хочу сгенерировать URL-адрес с использованием временных учетных данных (ключ доступа, секретный ключ и токен). этот URL-адрес клиента для доступа к объекту S3. Поскольку я предполагаю, что мой env менее безопасен, поэтому я хочу использовать временные учетные данные для доступа к объекту S3. - person user1488378; 21.01.2016
comment
Я хочу сгенерировать URL-адрес, используя временные учетные данные (ключ доступа, секретный ключ и токен), поделиться этим URL-адресом с клиентом для доступа к объекту S3 ==> это определение предварительно подписанного URL-адреса, см. docs.aws.amazon.com/fr_fr/AmazonS3/latest/dev/. Предварительно подписанный URL-адрес не включает ваши учетные данные, поэтому нет необходимости генерировать его с использованием временных учетных данных. - person Tom; 21.01.2016
comment
Спасибо, но если я хочу добиться того же, используя ссылку ниже ‹‹Пример запроса HTTPS API, подписанного с временными учетными данными безопасности›› docs.aws.amazon.com/IAM/latest/UserGuide/ - person user1488378; 21.01.2016
comment
Это точно так же, как я описываю, за исключением того, что вы ссылаетесь на API REST, а я ссылаюсь на соответствующий вызов sdk java. Вот почему я говорю, что подписанные URL-адреса используют временные учетные данные за сценой. Если вы сделаете, как описано в моем ответе, вы получите URL-адрес, разрешающий доступ к объекту для вашего клиента (или любого человека, у которого есть этот URL-адрес), и этот URL-адрес будет иметь временные учетные данные. Это 100% лучшая практика на сегодняшний день - person Tom; 21.01.2016
comment
просто попробуйте, я уверен, вы поймете, что я имею в виду, прочитав сгенерированный URL :) - person Tom; 21.01.2016