2013-07-05 24 views
13

Jestem nowicjuszem w serwisie internetowym REST i właśnie utworzyłem mój pierwszy serwis internetowy.
W mojej usłudze użytkownik może utworzyć profil za pomocą prostego formularza podając jego nazwę użytkownika i hasło.Jak korzystać z podstawowego uwierzytelniania HTTP z usługą REST (Java + Jersey)?

Teraz, jak sprawdzić dane logowania użytkownika, gdy użytkownik się loguje?
Mam na myśli, że mam prosty formularz, który sprawdza, czy użytkownik się zalogował, ale jak sprawdzić użytkownika, kiedy ma wykonywać różne operacje na profilu add/update/delete ??

Na przykład:
W FB ty logowania i przechowuje pliki cookie, które ma poświadczenia i podczas wykonywania czynności, takich jak „Status Post”, wiadomość znajomemu ... itd ... to nie prosi poświadczenia, ponieważ ma plik cookie, w którym znajdują się twoje poświadczenia i po prostu używa tego pliku cookie ...

Ale w REST nie używamy cookie, więc następną opcją są nagłówki HTTP. i chcę wiedzieć, jak wysyłać i odbierać dane uwierzytelniające użytkownika za pośrednictwem HTTP nagłówka .ie
Basic HTTP Auth

+0

Potrzebujesz więcej informacji na ten temat? Jeśli nie, a moja odpowiedź była dla ciebie pomocna, możesz zaakceptować mój post na to pytanie. Greetz :) – benjiman

Odpowiedz

29

Side Client

Aby wysłać poświadczenia do API użyć nagłówka HTTP Authorization, określając poświadczenia w postaci Basic username:password. Nazwa użytkownika: hasło Łańcuch musi być zakodowany przy użyciu schematu kodowania o nazwie Base64. Więc przykład nagłówek mógłby wyglądać następująco:

Authorization: Basic d2lraTpwZWRpYQ== 

Ponieważ specyfikacja reszta stwierdza, że ​​komunikacja klient-serwer powinien być bezpaństwowcem, trzeba zawierać nagłówek z mandatów na każde żądanie. Zwykle używasz pliku cookie sesji po stronie klienta, aby zidentyfikować użytkownika, aby nie musiał wpisywać poświadczeń na każde żądanie.

Server Side

Aby sprawdzić poświadczenia wewnątrz Jersey REST Service, trzeba złapać i przechwytywać wszystkie przychodzące żądania. W tym celu Jersey dostarcza koncepcję o nazwie ContainerRequestFilters. Na przykład, jeśli używasz Tomcat można dodać filtry tego typu wewnątrz definicji serwletu w web.xml tak:

<init-param> 
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> 
    <param-value>your.package.BasicAuthFilter</param-value> 
</init-param> 

powoływane klasa BasicAuthFilter musi wdrożyć Koszulki ContainerRequestFilter interfejs i zastąpić metodę public ContainerRequest filter(ContainerRequest request). Wewnątrz metody można zasadniczo wykonać następujące czynności:

  • pobierać Base64 zakodowane poświadczenia z nagłówka Authorization wniosku
  • ich dekodowania (czyli używając javax.xml.bind.DatatypeConverter.parseBase64Binary())
  • używać UserDao (lub innego dostawcy źródła danych) aby sprawdzić, czy poświadczenia są ważne
  • return kod statusu 401 Unauthorized, jeśli walidacja nie powiedzie się (np.throw new WebApplicationException(Status.UNAUTHORIZED))
  • jeśli poświadczenia są prawidłowe, po prostu zwraca jej wniosek, aby przekazać go do Jersey zasób, który jest odpowiedzialny za obsługę to

można znaleźć bardzo dobry przykład w this blogu.

+2

przykład podanego linku działa tylko z JERSEY 1.x. I nie działa z wersją 2.X. – lonelyloner

+1

Połączony wpis na blogu zawiera link do przykładu dla Jersey 2.x: https://simplapi.wordpress.com/2015/09/17/jersey-jax-rs-implements-a-http-basic-auth-decoder -do-2-x-oddział / – CalumMcCall