2011-07-19 33 views
20

Tôi đã phát triển một REST api cho ứng dụng Symfony2 của mình. Api này sẽ được ứng dụng dành cho thiết bị di động sử dụng. Hầu hết các chức năng được thực hiện trong bối cảnh của người sử dụng hiện xác thực, ví dụ:Xác thực cho api Symfony2 (để sử dụng ứng dụng di động)

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

Tôi hy vọng rằng các ứng dụng di động sẽ có thể gửi đến action login giống như một hình thức web truyền thống. Nếu các thông tin kiểm tra sau đó Symfony2 hiện nó điều và đặt một cookie (điều này thậm chí làm việc trong bối cảnh của một ứng dụng di động truy cập api?). Sau đó, các yêu cầu api sau đó từ điện thoại di động đó (hy vọng) sẽ hoạt động với vùng chứa bản ghi dịch vụ security.context của symfony2.

Điều này có hiệu quả không? Tôi cần phải tìm ra quy trình ủy quyền này trước khi tôi lấy API cho các nhà phát triển di động. Nếu có thể tôi rõ ràng muốn có thể sử dụng dịch vụ security.context bản địa thay vì xây dựng một hệ thống auth mới cho api sử dụng xAuth hoặc một cái gì đó tương tự.

Cảm ơn

Trả lời

13

Tôi nghĩ bạn nên làm điều đó không trạng thái (không có cookie).

tôi đã cùng một vấn đề, những gì tôi đã làm:

  • trong ứng dụng của bạn/config/security.yml, thêm:
 
security: 
    ... 
    firewalls: 
     rest_webservice: 
      pattern: /webservice/rest/.* 
      stateless: true 
      http_basic: 
       provider: provider_name 
    ... 
  • Bây giờ bạn có thể thực hiện một yêu cầu webservice của bạn:
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 thú vị. Tôi không hoàn toàn chắc chắn tôi làm theo mọi thứ ở đây. Bạn có thể đi qua một trường hợp ví dụ đầy đủ? tức là người dùng foo cung cấp tên người dùng/mật khẩu của họ cho ứng dụng dành cho thiết bị di động. Ứng dụng sau đó bao gồm tên người dùng và mật khẩu đó với mọi yêu cầu đối với API? Trong bản rõ? Điều đó có an toàn không? Xin lỗi nếu tôi hiểu nhầm điều gì đó ở đây! – Marc

+0

Do dondlero cho biết bạn phải tắt cookie, đó là lý do tại sao tôi thêm tham số không trạng thái thành true. Personnaly tôi không thích xác thực tiêu hóa bởi vì nó rất khó thực hiện. Http phương pháp cơ bản là dễ dàng và hoạt động tốt. tên người dùng và mật khẩu hiển thị trong mọi yêu cầu. Bạn phải sử dụng chứng nhận SSL. – julesbou

+0

Lạ, tôi vẫn nhận được tiêu đề 'Set-Cookie' ngay cả sau khi đặt' stateless: true'. Bất kỳ ý tưởng tại sao điều đó có thể xảy ra? –

3

Có Marc, jules đang trỏ đến một ví dụ để chỉ cho bạn cách kiểm tra xác thực bằng http_basic.

Để được RESTful, bạn nên tránh sử dụng cookie, nếu không, hãy gọi nó là API. Về hệ thống xác thực của bạn an toàn như thế nào, bạn có thể truy cập http_digest qua https hoặc yêu cầu được ký kết an toàn hơn bằng phương pháp api_key/api_secret.

Có một cái nhìn ở đây http://wiki.zanox.com/en/RESTful_API_authentication

Các vấn đề liên quan