5

Tworzę interfejs API REST dla mojej aplikacji opartej na JS.Aplikacja Symfony2 z uwierzytelnianiem RESTful, przy użyciu FOSRestBundle i FOSUserBundle

Podczas logowania formularz logowania jest przesyłany za pośrednictwem AJAX do mojego interfejsu API pod adresem /rest/login.

  • Jeżeli logowanie jest pomyślny, to zwraca 204
  • Jeśli nie, to zwraca 401

Chociaż zostały rozdzielone zapór dla API i samą aplikacją, mają ten sam kontekst, w jakim powinno to oznaczać, że gdy użytkownik uwierzytelnia się w stosunku do interfejsu API, jest również uwierzytelniany w stosunku do aplikacji. Tak więc, gdy serwer zwraca 204, strona będzie przeładować i powinien przekierować użytkownika do aplikacji, bo jest teraz zalogowany.

Próbowałem użyć gotowego check_login stronę z FOSUserBundle i wskazał /rest/login tam.

login: 
    path: /rest/login 
    defaults: 
     _controller: FOSUserBundle:Security:check 
    methods: [ POST ] 

To nie działa, ponieważ zawsze zwraca przekierowanie, bez względu na wszystko. Czytałem dokumentację dla symfony i nie mogłem znaleźć, jak stworzyć niestandardową stronę check_login. To, czego potrzebuję, to coś takiego. Nie mam pojęcia, jak to zrobić. Nie mam pojęcia, jak to zrobić. Nic, co znalazłem w jakiejkolwiek dokumentacji, pomogło mi trochę. Będę wdzięczny za każdą sugestię, która wskaże mi właściwy kierunek.


EDYCJA: W celu dalszego uproszczenia, do czego dążę. Chcę, aby mój login działał dokładnie tak samo, jak normalnie form_login. Chcę tylko zmienić odpowiedź, która odsyła - zamiast przekierowania chcę 204 na sukces i 401 na niepowodzenie.

Odpowiedz

12

Udało mi się znaleźć proste rozwiązanie. Musiałem tylko napisać klasę, która implementuje AuthenticationSuccessHandlerInterface i AuthenticationFailureHandlerInterface.

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface; 
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface; 

class AuthenticationRestHandler implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface { 

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { 
     return new Response('', Response::HTTP_UNAUTHORIZED); 
    } 

    public function onAuthenticationSuccess(Request $request, TokenInterface $token) { 
     return new Response('', Response::HTTP_NO_CONTENT); 
    } 
} 

Następnie zarejestrowałem go jako usługę i skonfigurowałem jako obsługę firewalla.

services: 
    security.authentication_rest_handler: 
    class: AuthenticationRestHandler 

security: 
    firewalls: 
    rest: 
     pattern: ^rest 
     context: app 
     form_login: 
     check_path: /rest/login 
     provider: fos_userbundle 
     failure_handler: inspireon.security.authentication_rest_handler 
     success_handler: inspireon.security.authentication_rest_handler 
     username_parameter: login 
     password_parameter: password 

Problem rozwiązany i nie skomplikowany dostawcy uwierzytelniania potrzebne :-)

1

Rozumiem twój problem, ponieważ przeszedłem przez podobną sytuację, ale z usługami SOAP. W połowie I może ponownie przeszukać WSSE bezpieczeństwa i Symfony2 już dostarcza rozwiązania

http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html

współpracuje z prawdziwego tokena i można dopasować z użytkownikiem w FOSUserBundle. Jedyne, co widzę, to to, że pole "hasło", które chcesz porównać, jest takie samo, jak w bazie danych (z szyfrowaniem), więc zdecydowałem się utworzyć dodatkowe pole tylko dla tego użycia.

Mam nadzieję, że ci to pomoże.

Pozdrowienia

+0

tak, to czy muszę wdrożyć zupełnie nowy dostawcy uwierzytelniania zwyczaj?Imo to trochę przesada, ponieważ wszystko, co trzeba zmienić, to zachowanie słuchacza, aby wysłać 204/401 zamiast przekierowania, a nie cały proces. –