2011-02-18 11 views
6

Estoy compilando una aplicación PHP desde cero (usando el framework Kohana3). Voy a diseñarlo para poder usar una API para acceder a los datos internamente. Al mismo tiempo, quiero finalmente ofrecerlo al público.Necesito una API. ¿Donde debería empezar?

Planeo utilizar el método de acceso RESTful. Sin embargo, estoy teniendo dificultades para encontrar información clara sobre cómo proteger adecuadamente la API. En otras palabras, ¿cómo implemento firmas API y acceso?

Respuesta

5

Puede probar frapi. Rápidamente le permitirá construir su API RESTful, que luego puede usar para su aplicación, y en una fecha posterior exponer la misma API públicamente.

+0

Wow frapi parece bastante dulce, aunque su sitio es mucho más espartano de lo que parece una vez que empiezas a hacer clic. – Justin

1

Creo que un buen lugar para comenzar sería leer más información general sobre la firma digital. Wikipedia es un gran recurso http://en.wikipedia.org/wiki/Public_Key_Infrastructure o http://en.wikipedia.org/wiki/X.509.
En un nivel básico, le daría a cada cliente una clave privada. En la biblioteca del cliente encriptaría la clave. Cuando un cliente realiza una solicitud, verifique que la clave sea la que le haya enviado a ese cliente en particular.

+1

Otro enlace para buscarlo es http://www.oauth.net/ – NotMe

+1

Sí. Esto es lo que trato de entender. Oauth confunde los métodos de implementación como proveedor dentro de mi propia aplicación. Preferiría hacerlo yo mismo, aprender y luego considerar el uso de sus bibliotecas siempre cambiantes. Estoy teniendo problemas en lo básico. Usted explicó algo similar a lo que imaginé. Aunque, las sesiones y las cookies también juegan un papel para mantener las solicitudes iniciadas. Usar el inicio de sesión delegado también es otro problema. – Andres

0

He hecho una API PHP REST usando CodeIgniter con Autenticación básica, (proporcionando "id de la compañía" y "Clave de la API" como nombre de usuario/contraseña). Más tarde descubrimos que era necesario proporcionar claves de sesión que estaban directamente relacionadas con una clave API, solo con un tiempo de vencimiento.

Básicamente, consultamos diferentes tipos de datos en nuestro almacén de datos (variedad nosql :) dependiendo de lo que se proporcionó el "método" en la URL. Accedimos a esto usando la habilidad de "segmento" provista por CodeIgniter.

Luego completamos cada respuesta con un "json_encode" que se devolvió y también usamos una conexión HTTPS para mayor seguridad.

Para la clase de cliente envolvemos todo en llamadas tales $ client-> get_my_data ($ api_key), con una capa debajo usando PHP Libcurl, que funciona muy bien para proporcionar Basic Auth.

Espero que esto ayude,

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

Por clase de cliente, ¿te refieres a la interfaz principal que los clientes hablan con RESTful URLS? Me gusta, cliente [controlador], get_name [método] con URL como: site.com/api/client/123?apikey=12345 que dispara $ client-> get_name ('123', apikey)? – Andres

+0

Eso sí, eso es correcto, entonces el cliente puede incluir la clase y tener acceso a ella dentro de un archivo php, actualizaré mi respuesta con una función de ejemplo "get" para CURL. –

0

Su pregunta es un poco más grande que esto; pero puedo ofrecer una pequeña observación sobre REST.

He encontrado que con REST, es mejor usar claves artificiales para el modelo de datos subyacente, en lugar de claves naturales. Por ejemplo, considere la url RESTfull: https://server/yourApp/viewUser/1234.html, esto mostraría al usuario con la ID 1234. Sin embargo, si utilizó claves naturales, podría tener una URL como esta https://server/yourApp/viewUser/Bob.html o peor si en lugar de Bob es "Bob X" o "peor". Bob? Clave = valor ". No debe tener que pensar en generar URL inválidas.

+0

Gracias, pero no la respuesta que estaba buscando. Estoy buscando claves de autenticación ... más o menos. – Andres

+0

No entendí esa parte del frapi tampoco (no veo dónde definen lo que es una "clave de API". Hice mi control de acceso en términos de temas y autorizaciones. Puede usar HTTP BASIC/SSL o SSL Autorización mutua para establecer una identificación de sujeto, y lo que quiera para la autorización. – Justin

2

OAuth sería una buena opción. Lo mismo ocurriría con un solo par clave/valor. También es posible que desee consultar Mashape, pero no está del todo seguro de que se ajuste a lo que está tratando de hacer.

1

Eche un vistazo a 3scale (http://www.3scale.net/) para hacer esto: maneja la autenticación, el control de acceso, las políticas, los límites de velocidad, etc. y es gratis para un tráfico significativo. Tenemos un módulo PHP para agregar al sistema para habilitar estas características. (Descargo de responsabilidad - Yo trabajo allí - ¡pero espero que sea útil!)

Cuestiones relacionadas