2011-02-18 34 views
6

Tôi đang xây dựng một ứng dụng PHP từ đầu (sử dụng khung công tác Kohana3). Tôi sẽ kiến ​​trúc nó để tôi có thể sử dụng một API để truy cập dữ liệu trong nội bộ. Đồng thời, tôi muốn cung cấp nó cho công chúng.Tôi cần một API. Tôi nên bắt đầu từ đâu?

Tôi định sử dụng phương thức truy cập RESTful. Tuy nhiên, tôi đang gặp khó khăn khi tìm thông tin rõ ràng về cách bảo mật API đúng cách. Nói cách khác, làm cách nào để triển khai chữ ký và quyền truy cập API?

Trả lời

5

Bạn có thể thử frapi. Nó sẽ nhanh chóng cho phép bạn xây dựng RESTful API của mình, mà sau đó bạn có thể sử dụng cho ứng dụng của bạn, và vào một ngày sau đó công khai cùng một API.

+0

Wow frapi trông khá ngọt ngào, mặc dù trang web của họ là spartan xa hơn nhiều so với khi bạn bắt đầu nhấp vào xung quanh. – Justin

1

Tôi nghĩ rằng một nơi tốt để bắt đầu sẽ được đọc qua thông tin chung về ký kỹ thuật số. Wikipedia là một tài nguyên tuyệt vời http://en.wikipedia.org/wiki/Public_Key_Infrastructure hoặc http://en.wikipedia.org/wiki/X.509.
Ở cấp độ cơ bản, tôi sẽ cung cấp cho mỗi khách hàng một Khóa riêng. Trong thư viện khách, tôi sẽ mã hóa khóa. Khi một khách hàng thực hiện yêu cầu, hãy xác minh rằng khóa là khóa mà bạn đã cấp cho khách hàng cụ thể đó.

+1

Một liên kết khác để xem nó là http://www.oauth.net/ – NotMe

+1

Có. Đây là những gì tôi đang cố gắng để hiểu. Oauth là khó hiểu trong các phương pháp làm thế nào để thực hiện như là một nhà cung cấp trong ứng dụng của riêng tôi. Tôi thà tự mình làm, học hỏi, và sau đó xem xét sử dụng các thư viện của họ, luôn thay đổi. Tôi đang gặp rắc rối về những điều cơ bản. Bạn giải thích một cái gì đó tương tự như những gì tôi hình dung. Mặc dù, phiên và cookie cũng đóng một vai trò trong việc giữ các yêu cầu đã đăng nhập. Sử dụng đăng nhập được ủy quyền cũng là một vấn đề hoàn toàn khác. – Andres

0

Tôi đã tạo API REST PHP bằng CodeIgniter với Xác thực cơ bản, (cung cấp "id công ty" và "Khóa API" làm tên người dùng/mật khẩu). Sau đó, chúng tôi thấy rằng cần phải cung cấp khóa phiên liên quan trực tiếp đến Khóa API, chỉ với thời gian hết hạn.

Về cơ bản, chúng tôi truy vấn các loại dữ liệu khác nhau trong kho dữ liệu của chúng tôi (giống nosql :) tùy thuộc vào phương thức "được cung cấp trong URL". Chúng tôi đã truy cập điều này bằng cách sử dụng khả năng "phân đoạn" do CodeIgniter cung cấp.

Sau đó, chúng tôi gói từng phản hồi bằng "json_encode" đã được trả về và chúng tôi cũng sử dụng kết nối HTTPS để bảo mật.

Đối với lớp khách hàng, chúng tôi gói mọi thứ trong các cuộc gọi như $ client-> get_my_data ($ api_key), với một lớp bên dưới bằng cách sử dụng PHP Libcurl, hoạt động thực sự tốt để cung cấp Basic Auth.

Hope this helps,

CURL_GET

private function curl_get($url, $apikey, $co) 
    { 
     $curl_handle = curl_init(); 
     curl_setopt($curl_handle, CURLOPT_URL, $url); 
     curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); 
     curl_setopt($curl_handle, CURLOPT_SSL_VERIFYPEER, FALSE); 
     curl_setopt($curl_handle, CURLOPT_USERPWD, $co.":".$apikey); 
     curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($curl_handle, CURLOPT_DNS_USE_GLOBAL_CACHE, FALSE); 

     $buffer = curl_exec($curl_handle); 
     $error = curl_error($curl_handle); 
     curl_close($curl_handle); 
     // check for success or failure 
     if (empty($buffer)) { 
     //echo 'Something went wrong :(error: '.$error.'<Br>'; 
     } else { 
     return $buffer; 
     } 
    } 
+0

Theo lớp khách hàng, bạn có nghĩa là giao diện chính mà khách hàng nói chuyện với RESTful URLS không? Giống như, khách hàng [điều khiển], get_name [phương pháp] với URL như: site.com/api/client/123?apikey=12345 mà cháy $ client-> get_name ('123', apikey)? – Andres

+0

Thats yes thats đúng, vì vậy sau đó khách hàng có thể bao gồm các lớp học và có quyền truy cập vào nó bên trong một tập tin php, tôi sẽ cập nhật câu trả lời của tôi với một ví dụ "có được" chức năng cho CURL. –

0

Câu hỏi của bạn là một chút lớn hơn này; nhưng tôi có thể đưa ra một quan sát nhỏ về REST.

Tôi đã tìm thấy với REST, đó là cách tốt nhất là sử dụng các khóa nhân tạo cho mô hình dữ liệu cơ bản, thay vì các khóa tự nhiên. Ví dụ: xem xét địa chỉ RESTfull url: https://server/yourApp/viewUser/1234.html sẽ hiển thị người dùng có id 1234. Tuy nhiên, nếu bạn đã sử dụng các khóa tự nhiên, bạn có thể có URL giống như thế này https://server/yourApp/viewUser/Bob.html hoặc tệ hơn nếu thay vì Bob "Bob X" hoặc "Bob" Bob? Key = Giá trị ". Bạn không muốn phải suy nghĩ về việc tạo URL không hợp lệ.

+0

Cảm ơn, nhưng không phải là câu trả lời tôi đang tìm kiếm. Tôi đang tìm kiếm các khóa xác thực ... loại. – Andres

+0

Tôi cũng không hiểu phần đó của frapi (Tôi không thấy chúng xác định đâu là "Khóa API". Tôi đã kiểm soát truy cập của tôi về các chủ đề và ủy quyền. Bạn có thể sử dụng HTTP BASIC/SSL hoặc SSL auth chung để thiết lập một ID chủ đề, và bất cứ điều gì bạn muốn cho phép. – Justin

2

OAuth sẽ là một lựa chọn tốt. Vì vậy, một cặp khóa/giá trị duy nhất. Bạn cũng có thể muốn xem Mashape nhưng không hoàn toàn chắc chắn nó phù hợp với những gì bạn đang cố gắng làm.

1

Hãy xem 3scale (http://www.3scale.net/) để thực hiện việc này - nó xử lý xác thực, kiểm soát truy cập, chính sách, giới hạn tốc độ, v.v. và miễn phí cho lưu lượng truy cập đáng kể. Chúng tôi có một mô-đun PHP để bổ sung cho hệ thống để kích hoạt các tính năng này. (Disclaimer - Tôi làm việc ở đó - nhưng hy vọng nó hữu ích!)

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