2011-02-18 17 views
6

Buduję aplikację PHP od zera (przy użyciu struktury Kohana3). Mam zamiar go zaprojektować, aby móc korzystać z interfejsu API w celu wewnętrznego dostępu do danych. W tym samym czasie chcę w końcu zaoferować go społeczeństwu.Potrzebuję API. Gdzie powinienem zacząć?

Mam zamiar używać metody dostępu RESTful. Mam jednak trudności ze znalezieniem jasnych informacji o tym, jak właściwie zabezpieczyć API. Innymi słowy, w jaki sposób mogę zaimplementować podpisy API i dostęp do nich?

Odpowiedz

5

Możesz spróbować frapi. Pozwoli to szybko zbudować interfejs RESTful API, który następnie można wykorzystać w aplikacji, a później udostępnić publicznie ten sam interfejs API.

+0

Wow frapi wygląda całkiem nieźle, chociaż ich strona jest znacznie bardziej spartańska niż wygląda, gdy zaczniesz klikać. – Justin

1

Myślę, że dobrym miejscem na rozpoczęcie byłoby czytanie ogólnych informacji o cyfrowym podpisywaniu. Wikipedia to wielki zasób http://en.wikipedia.org/wiki/Public_Key_Infrastructure lub http://en.wikipedia.org/wiki/X.509.
Na poziomie podstawowym dałbym każdemu klientowi klucz prywatny. W bibliotece klienta zaszyfruję klucz. Gdy klient zgłasza żądanie, sprawdź, czy klucz jest tym kluczem, który wydałeś temu klientowi.

+1

Kolejny link do obejrzenia jest http://www.oauth.net/ – NotMe

+1

Tak. Właśnie to staram się zrozumieć. Oauth wprowadza zamieszanie w metodach implementacji jako dostawca w mojej aplikacji. Wolałbym zrobić to sam, uczyć się, a następnie rozważyć używanie ich ciągle zmieniających się bibliotek. Mam kłopot z podstawami. Wyjaśniłeś coś podobnego do tego, co sobie wyobraziłem. Chociaż sesje i pliki cookie również odgrywają rolę w utrzymywaniu zgłoszeń zalogowanych. Korzystanie z delegowanego logowania jest zupełnie innym problemem. – Andres

0

Zrobiłem API REST PHP przy użyciu CodeIgniter z podstawowym uwierzytelnieniem, (podając "identyfikator firmy" i "klucz API" jako nazwę użytkownika/hasło). Później okazało się, że konieczne było dostarczenie kluczy sesji, które były bezpośrednio związane z kluczem API, tylko z czasem wygaśnięcia.

Zasadniczo, przeszukaliśmy różne rodzaje danych w naszym magazynie danych (odmiany nosql :) w zależności od tego, co "metoda" została podana w adresie URL. Uzyskaliśmy do tego dostęp za pomocą zdolności "segmentu" zapewnianej przez CodeIgniter.

Następnie zawijaliśmy każdą odpowiedź za pomocą "json_encode", który został zwrócony, a także dla bezpieczeństwa używaliśmy połączenia HTTPS.

Dla klasy klienta zawijaliśmy wszystko w wywołaniach takich jak $ client-> get_my_data ($ api_key), z warstwą pod spodem za pomocą PHP Libcurl, która działa bardzo dobrze, aby zapewnić podstawowe uwierzytelnianie.

Nadzieja to pomaga,

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

Według Klasy Klienta, masz na myśli główny interfejs, z którym klienci rozmawiają z RESTful URLS? Podobnie jak klient [kontroler], get nazwa [metoda] z adresem URL: site.com/api/client/123?apikey=12345, który uruchamia klienta $ -> get_name ("123", apikey)? – Andres

+0

To tak, to prawda, więc klient może dołączyć do klasy i mieć do niej dostęp w pliku php. Zaktualizuję moją odpowiedź za pomocą przykładowej funkcji "get" dla CURL. –

0

Twoje pytanie jest nieco większy niż ten; ale mogę zaoferować jedną małą obserwację o REST.

Znalazłem z REST, że najlepiej jest używać sztucznych kluczy dla podstawowego modelu danych, a nie kluczy naturalnych.

Weźmy na przykład URL RESTfull: https://server/yourApp/viewUser/1234.html, który wyświetliłby użytkownika o identyfikatorze 1234. Jednakże, jeśli użyłeś naturalnych kluczy, możesz mieć URL podobny do tego https://server/yourApp/viewUser/Bob.html lub gorzej, jeśli zamiast Boba jego "Bob X" lub " Bob? Key = Value ". Nie musisz myśleć o generowaniu nieprawidłowych adresów URL.

+0

Dzięki, ale nie odpowiedź, której szukałem. Szukam kluczy uwierzytelniających ... sort. – Andres

+0

Nie zrozumiałem również tej części frapi (nie widzę, gdzie definiują, czym jest "klucz API") Zrobiłem moją kontrolę dostępu pod względem podmiotów i uprawnień. Możesz użyć HTTP BASIC/SSL lub SSL wzajemne uwierzytelnianie w celu ustalenia identyfikatora podmiotu i cokolwiek chcesz dla autoryzacji. – Justin

2

OAuth byłby dobrym wyborem. Tak samo jak pojedyncza para klucz/wartość. Możesz również spojrzeć na Mashape, ale nie do końca wiesz, czy pasuje do tego, co próbujesz zrobić.

1

Spójrz na 3scale (http://www.3scale.net/), aby to zrobić - obsługuje uwierzytelnianie, kontrolę dostępu, zasady, limity stawek itp. I jest bezpłatny dla znacznego ruchu. Mamy moduł PHP do wtyczki do systemu, aby włączyć te funkcje. (Zrzeczenie się - pracuję tam - ale mam nadzieję, że będzie przydatna!)

Powiązane problemy