2015-10-08 17 views
9

Obrazy są przesyłane do wiaderka Amazon S3. Muszę uzyskać adresowany adres URL z serwera Amazon. Również chcę ustawić czas wygaśnięcia tego adresu URL. Może to potrwać maksymalnie 17 dni. Ale nie mogę ustawić maksymalnie 1 roku czasu wygaśnięcia.Sposób ustawiania czasu wygaśnięcia adresu URL Amazon S3 za 1 rok od bieżącej daty

 Calendar cal = Calendar.getInstance(); 
     cal.add(Calendar.YEAR, 1); 
     Date nextYear = cal.getTime(); 

    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(
       "bucketName", "accessname"); 
     generatePresignedUrlRequest.setMethod(HttpMethod.GET); 
     generatePresignedUrlRequest 
       .setExpiration(nextYear); 
     URL url = s3client 
       .generatePresignedUrl(generatePresignedUrlRequest); 
     bucketURL = url.toString(); 
+0

TL: Algorytm DR-v4 umożliwia tylko 7 dni. (W odniesieniu do wersji 4 dokumentacji: ta najnowsza wersja sygnatury jest obsługiwana we wszystkich regionach, a wszelkie nowe regiony po 30 stycznia 2014 będą obsługiwały tylko wersję podpisu 4). Więc lepiej jest generować adres URL, jeśli jest to wymagane. – HopeKing

Odpowiedz

13

Nie "dostajesz" wstępnie podpisanego adresu URL "z serwera". Obliczanie podpisu odbywa się na kliencie. Wstępnie podpisane adresy URL są faktycznie obliczane na komputerze, a nie na podstawie usługi.

Jeśli używasz bieżącego zestawu SDK, prawdopodobnie używa on podpisu V4. Jeśli podany URL zawiera X-Amz-Signature=, oznacza to potwierdzenie V4. Starszy algorytm V2 używa tylko Signature= w podpisanym adresie URL.

Jeśli podpis jest rzeczywiście V4, potem widzisz celowe ograniczenie:

presigned URL może być ważne przez maksymalnie siedem dni, ponieważ klucz podpisanie użyć w obliczeniach podpis jest ważny przez okres do siedmiu dni.

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

Jeśli już używasz V2, powinieneś być w stanie podpisać URL z czasów ważności dopiero w roku 2038. Jeśli używasz V4, można obejść ograniczenia, przełączając się użyj V2, ale nie jest to zalecane. V2 nie jest obsługiwany w nowszych regionach S3, np. We Frankfurcie, a jeśli obrócisz klucze dostępu AWS tak, jak powinieneś, ewentualne unieważnienie klucza unieważni również wszystkie podpisy utworzone przy pomocy tego klucza.

Bardziej poprawnym podejściem w większości przypadków jest generowanie podpisanego adresu URL, gdy jest to potrzebne. Ta operacja, jak wspomniano, nie wymaga interakcji z usługą S3 i może być zwykle wykonywana w czasie rzeczywistym.

Jeśli chcesz przyznać konkretnemu użytkownikowi dostęp do "bezpośredniego linku", rozważ utworzenie punktu końcowego w aplikacji, w którym można zweryfikować dane uwierzytelniające użytkownika, w którym momencie możesz wygenerować podpisany adres URL i przekierować przeglądarkę za pomocą Odpowiedź HTTP 302.

+0

Jak przejść na V2? Czy istnieje dla niego globalna własność? – Ruslan

+1

V2 nie działa w nowszych regionach, @Ruslan, a ponieważ V4 jest pod wieloma względami znacznie lepszym algorytmem, nie wiem, czy to możliwe, ale prawdopodobnie tak jest. W jakim regionie pracujesz i jakiego SDK używasz? Coś, o czym powinienem pomyśleć, żeby mentować w tej odpowiedzi, to CloudFront. CloudFront używa innego mechanizmu uwierzytelniania niż S3, ale może być użyty przed każdym segmentem. Podpisane adresy URL CloudFront nie są ograniczone do krótkich interwałów czasowych i mają dwie opcje: S3 nie - możesz ograniczyć podpisany adres URL do używania z pojedynczego adresu IP i możesz również ustawić czas rozpoczęcia. –

+1

Myślę, że jestem w starym regionie. Dziękuję za odpowiedź, ale znalazłem już rozwiązanie :-) clientConfiguration.setSignerOverride ("S3SignerType") – Ruslan

Powiązane problemy