2011-02-18 24 views
6

Sto costruendo un'applicazione PHP da zero (usando il framework Kohana3). Lo installerò in modo da poter utilizzare un'API per accedere ai dati internamente. Allo stesso tempo, voglio infine offrirlo al pubblico.Ho bisogno di un'API. Dove dovrei iniziare?

Ho intenzione di utilizzare il metodo di accesso RESTful. Tuttavia, ho difficoltà a trovare informazioni chiare su come proteggere correttamente l'API. In altre parole, come posso implementare le firme API e l'accesso?

risposta

5

Si potrebbe provare frapi. Ti consentirà rapidamente di creare la tua API RESTful, che potrai quindi utilizzare per la tua applicazione, e in un secondo momento esporrà pubblicamente la stessa API.

+0

Wow Frapi sembra piuttosto dolce, anche se il loro sito è molto più spartano di quanto sembri volta che si avvia cliccando in giro. – Justin

1

Penso che un buon punto di partenza potrebbe essere la lettura di più di informazioni di carattere generale sulla firma digitale. Wikipedia è una grande risorsa http://en.wikipedia.org/wiki/Public_Key_Infrastructure o http://en.wikipedia.org/wiki/X.509.
A livello base darei a ciascun cliente una chiave privata. Nella libreria client avrei crittografato la chiave. Quando un cliente effettua una richiesta, verifica che la chiave sia quella che hai emesso per quel particolare cliente.

+1

Un altro collegamento a guardare è http://www.oauth.net/ – NotMe

+1

Sì. Questo è quello che sto cercando di capire. Oauth confonde i metodi di implementazione come provider all'interno della mia applicazione. Avrei preferito farlo io stesso, imparare, e poi considerare l'utilizzo di loro, in continua evoluzione, le biblioteche. Sto avendo problemi sulle basi. Hai spiegato qualcosa di simile a ciò che immaginavo. Anche se, sessioni e cookie svolgono anche un ruolo nel mantenere le richieste autenticate. L'utilizzo dell'accesso delegato è anche un altro problema. – Andres

0

ho fatto un API REST PHP utilizzando CodeIgniter con l'autenticazione di base, (fornendo "società id" e "Chiave API" come username/password). Successivamente abbiamo scoperto che era necessario fornire chiavi di sessione direttamente correlate a una chiave API, solo con una scadenza.

In sostanza, abbiamo chiesto diversi tipi di dati nel nostro archivio dati (varietà NoSQL :) seconda di ciò che è stato fornito il "metodo" nell'URL. Ci siamo acceduti utilizzando l'abilità "segment" fornita da CodeIgniter.

Poi abbiamo avvolto ogni risposta con un "json_encode" che è stato restituito e abbiamo usato anche una connessione HTTPS per una maggiore sicurezza.

Per la classe client abbiamo avvolto tutto nelle chiamate $ client-> get_my_data ($ api_key), con un livello sotto usando Libcurl PHP, che funziona molto bene per fornire l'autenticazione di base.

Spero che questo aiuti,

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

per classe client, cosa si intende l'interfaccia principale che i clienti parlano attraverso con RESTful URL? Come, client [controller], get_name [metodo] con URL come: site.com/api/client/123?apikey=12345 che lancia $ client-> get_name ('123', apikey)? – Andres

+0

Quello sì sì, quindi il client può includere la classe e avere accesso ad esso all'interno di un file php, aggiornerò la mia risposta con un esempio di funzione "get" per CURL. –

0

La tua domanda è un po 'più grande di questa; ma posso offrire una piccola osservazione su REST.

ho trovato con riposo, cioè che è meglio usare chiavi artificiali per il modello di dati sottostante, anziché chiavi naturale.

Ad esempio, considerare l'URL RESTfull: https://server/yourApp/viewUser/1234.html questo mostrerebbe all'utente con ID 1234. Tuttavia se si utilizzano chiavi naturali si potrebbe avere un URL come questo o peggio se invece di Bob il suo "Bob X" o " Bob? key = valore". Non vuoi pensare a generare URL non validi.

+0

Grazie, ma non è la risposta che cercavo. Sto cercando le chiavi di autenticazione ... un po '. – Andres

+0

Non ho capito neanche questa parte della frapi (non vedo dove definiscono cos'è una "Chiave API". Ho fatto il controllo degli accessi in termini di soggetti e autorizzazioni. Puoi utilizzare HTTP BASIC/SSL o SSL Autenticazione reciproca per stabilire un ID soggetto e qualsiasi cosa tu desideri per l'autorizzazione. – Justin

2

OAuth sarebbe una buona scelta. Così sarebbe una singola coppia chiave/valore. Si potrebbe anche voler guardare Mashape ma non del tutto sicuro che si adatta a ciò che si sta tentando di fare.

1

Date un'occhiata a 3scale (http://www.3scale.net/) per fare questo - si gestisce l'autenticazione, controllo degli accessi, le politiche, limiti di frequenza, ecc ed è gratuito per il traffico significativo. Abbiamo un modulo PHP da collegare al sistema per abilitare queste funzionalità. (Disclaimer - Io lavoro lì - ma spero sia utile!)