2013-07-30 15 views
10

Potrzebuję autoryzacji i uwierzytelniania dla moich interfejsów REST API zaimplementowanych przy użyciu standardu JAX-RS, które mają być używane przez klientów mobilnych i niektóre urządzenia. Mam wiele urządzeń z unikalną identyfikacją urządzeń, które mogą POST niektóre dane. Klienci mobilni po prostu używają żądań GET do wyświetlania tych danych. Bardziej niepokoję się częścią POST, w której chcę uwierzytelnić klientów. Chciałbym również zachować prostotę. Myślę o używaniu prostej autoryzacji HTTP przez HTTPS z kluczem API. Moje pytanie brzmi: jak wygenerować ten klucz API?Strategia generowania kluczy usług REST interfejsu API

Odpowiedz

7

Możesz zajrzeć do Shiro: http://shiro.apache.org Jest to bardzo przyjemne środowisko do "bezpiecznego" API (autoryzacja, uwierzytelnianie i inne rzeczy dla bezpieczeństwa). Możesz zaimplementować "podstawowe uwierzytelnienie", aby "zalogować się" do użytkowników (poprzez nazwę użytkownika/hasło), a następnie dostarczyć im klucz API, za pomocą którego można wykonać "uwierzytelnianie tokena na okaziciela", aby umożliwić im dostęp do zasobów twój interfejs API. Aby to zrobić, że można określić to, co nazywa „Shiro filtry”, które są zdefiniowane przez zasobów API ... to jest zdefiniowane w „shiro.ini” jak następuje:

[main] 
authcBasicRealm = com.yourapp.shiro.UserAuthenticatorRealm 
tokenValidatorFilter = com.yourapp.shiro.BearerAuthenticationTokenFilter 
tokenValidatorRealm = com.yourapp.shiro.BearerAuthenticationTokenRealm 

[urls] 
/rest/hello/login/** = ssl[8443], noSessionCreation, authcBasic 
/rest/hello/hello = ssl[8443], noSessionCreation, tokenValidatorFilter 

Trzeba wdrożyć/rozszerzenie niektórych domyślnych filtrów Shiro, aby działały z DB, aby uzyskać dane uwierzytelniające użytkownika itp. Dobrze, że zapewniają wiele narzędzi do rozwiązywania problemów związanych z bezpieczeństwem, np .: generowanie kluczy API, solenie i szyfrowanie itp. spojrzeć na ich tutoriale, są na ogół bardzo dobre.

Istnieją inne ramy, a mianowicie Java EE ma wsparcie dla bezpieczeństwa, a także Spring zapewnia wsparcie dla bezpieczeństwa. Rzuć okiem na tę bardzo przyjemną prezentację Mat Raible, w której prezentuje i prezentuje te trzy frameworki: http://www.slideshare.net/mraible/java-web-application-security-denver-jug-2013

+0

Nie chcę używać innej struktury bezpieczeństwa. Ale i tak dzięki. – Salil

+1

Rozumiem ... ale jeśli chcesz zarządzać wszystkimi różnymi aspektami bezpieczeństwa w swojej usłudze sieciowej (podstawowa autoryzacja przez HTTPS, następnie wygeneruj i daj klucz użytkownikom, następnie uwierzytelnij klucz itp.) Prawdopodobnie będziesz robił rodzaj operacji, które sobie przedstawiłem ... których unikam sam, ponieważ nie jestem ekspertem od zabezpieczeń i wolę polegać na strukturze zaprojektowanej, aby poradzić sobie z tymi rzeczami. Java EE, Spring ma również frameworki/biblioteki, które zajmują się bezpieczeństwem, jeśli używasz jednego z nich (zaktualizowałem swoją odpowiedź w odniesieniu do tych). – emgsilva

0

Możesz użyć do tego celu UUID. UUID wygląda następująco:

550e8400-e29b-41d4-a716-446655440000 

Istnieją biblioteki do generowania UUID dostępne w każdym języku programowania.

+0

W jaki sposób serwer będzie wiedział, co UUID wygenerował klient i na odwrót? – Salil

+0

Ok, teraz pytam, jak mam wtedy dystrybuować klucze? – Salil

+3

Identyfikatory UUID mają tylko 128 bitów, a w zależności od metody generowania mogą istnieć wzorce ich generowania, z których exploit może skorzystać. –

0

szukam w tym na mojej stronie, jak również, jeśli chcę opierając się na standardach JAX-RS i utrzymując aplikację "czystą", użyłbym domyślnego systemu uwierzytelniania, który jest dostarczany z kontenerem (zwykle jest to BASIC auth).

Oznacza to, że kontener musiałby przeprowadzić autoryzację i autoryzację na poziomie kursu, takie jak aplikacje Java EE zgodne z normą i nie tworzyć obejść (np. Za pomocą Shiro).

Jeśli jednak chcesz używać koncepcji tokenów API i tym podobnych, a jednocześnie nie chcesz, aby Twoja aplikacja była wolna od wdrożenia systemu uwierzytelniania, musisz wdrożyć tę pracę w innym miejscu, np. W kontenerze.

Niestety, uwierzytelnianie oparte na kontenerach musi być specyficzne dla kontenera. JAAS nie opisuje standardowego interfejsu API kontenera do wykonywania dziedzin uwierzytelniania. Nawet ich tutorial http://docs.oracle.com/javaee/6/tutorial/doc/bnbxj.html mówi o konfiguracji specyficznej dla Glassfish.

Jeśli Twoja organizacja jest wystarczająco duża, DataPower obsługuje również OAuth http://www.ibm.com/developerworks/websphere/library/techarticles/1208_rasmussen/1208_rasmussen.html, dzięki czemu możesz go prawdopodobnie użyć do zarządzania uwierzytelnianiem i przekazania odpowiednich danych uwierzytelniających do aplikacji. Jednak. nadal musisz zrobić coś konkretnego sprzedawcy.

Nie jest to jednak złe, wolałbym raczej to podejście, niż zanieczyszczać aplikację własnym systemem uwierzytelniania, przez co sytuacja staje się nieelastyczna w przypadku zmiany systemu uwierzytelniania. na przykład SonarQube ma swój własny system uwierzytelniania, który nie obsługuje certyfikatów po stronie klienta.

+0

inne podejście Myślę, ale nie wiem, jak to działałoby (dlatego nie dodałem go jako odpowiedzi) używa bouncycastle do generowania certyfikatu po stronie klienta, aby użytkownik mógł się zalogować. –

Powiązane problemy