2011-07-19 13 views
20

Opracowałem interfejs API REST dla mojej aplikacji Symfony2. Ten api będzie używany przez aplikację mobilną. Znaczna część funkcjonalności odbywa się w kontekście aktualnie uwierzytelnionego użytkownika, tj:Uwierzytelnianie dla aplikacji Symfony2 api (do korzystania z aplikacji mobilnych)

$this->container->get('security.context')->getToken()->getUser() 

Mam nadzieję, że aplikacja mobilna będzie w stanie odpowiedzieć na działanie logowania podobnie jak tradycyjnej formie internetowej. Jeśli poświadczenia się sprawdzą, Symfony2 robi to i ustawia plik cookie (czy to działa nawet w kontekście aplikacji mobilnej uzyskującej dostęp do interfejsu API?). Później żądania api z tego telefonu komórkowego (miejmy nadzieję) będą działać z rodzimym kontenerem usługi symfony2 security.context.

Czy to działa? Muszę wymyślić ten proces autoryzacji, zanim przejdę do interfejsu API aplikacji mobilnych. Jeśli to możliwe, oczywiście chciałbym móc korzystać z natywnej usługi security.context zamiast budować nowy system autoryzacji dla api, który używa xAuth lub czegoś podobnego.

Dzięki

Odpowiedz

13

myślę, że należy to zrobić bezpaństwowcem (bez plików cookie).

miałem ten sam problem, co zrobiłem:

  • w app/config/security.yml dodać:
 
security: 
    ... 
    firewalls: 
     rest_webservice: 
      pattern: /webservice/rest/.* 
      stateless: true 
      http_basic: 
       provider: provider_name 
    ... 
  • Teraz można złożyć wniosek do Twój serwis internetowy:
class AuthTest extends WebTestCase 
{ 
    public function testAuthenticatedWithWebservice() 
    { 
     $client = $this->createClient(); 

     // not authenticated 
     $client->request('GET', '/webservice/rest/url'); 
     $this->assertEquals(401, $client->getResponse()->getStatusCode()); 

     // authenticated 
     $client->request('GET', '/webservice/rest/url', array(), array(), array(
      'PHP_AUTH_USER' => 'username', 
      'PHP_AUTH_PW' => 'password' 
     )); 
     $this->assertEquals(200, $client->getResponse()->getStatusCode()); 
    } 
} 
+0

Hmm ciekawy. Nie jestem pewien, czy podążam za wszystkim tutaj. Czy mógłbyś przejść przez pełny przykładowy przypadek? tj. użytkownik foo podaje swoją nazwę użytkownika/hasło do aplikacji mobilnej. Aplikacja następnie zawiera tę nazwę użytkownika i hasło przy każdym żądaniu do interfejsu API? W zwykłym tekście? Czy to bezpieczne? Przepraszam, jeśli coś tu nie rozumiem! – Marc

+0

Jak powiedział dondlero, musisz wyłączyć pliki cookie, dlatego dodam parametr bezpaństwowy do true. Personalny Nie lubię uwierzytelniania digest, ponieważ jest to bardzo trudne do wdrożenia. Podstawowa metoda Http jest łatwa i działa dobrze. nazwa użytkownika i hasło są widoczne w każdym żądaniu. Musisz użyć certyfikatu SSL. – julesbou

+0

Dziwne, nadal otrzymuję nagłówki 'Set-Cookie' nawet po ustawieniu' stateless: true'. Jakiś pomysł, dlaczego tak się stało? –

3

Tak Marc, jules wskazuje na przykład, aby pokazać, jak przetestować uwierzytelnianie za pomocą http_basic.

Aby być RESTful powinieneś unikać używania plików cookie, inaczej nazwij to API. O tym, jak bezpieczny jest twój system uwierzytelniania, możesz iść z http_digest przez https lub bezpieczniejszym podpisanym żądaniem z podejściem api_key/api_secret.

Sprawdźcie tutaj http://wiki.zanox.com/en/RESTful_API_authentication

Powiązane problemy