php - kacerguis - crear restful codeigniter
Pasando las llaves de la API para descansar api (2)
Deberías mirar en la firma de solicitudes. Un buen ejemplo es la API S3 REST de Amazon .
La descripción general es bastante simple. El usuario tiene dos datos importantes para usar su API, una identificación de usuario pública y una clave de API privada. Envían la identificación pública con la solicitud y usan la clave privada para firmar la solicitud. El servidor receptor busca la clave del usuario y decide si la solicitud firmada es válida. El flujo es algo como esto:
- El usuario se une a su servicio y obtiene una identificación de usuario (por ejemplo, 123) y una clave API.
- El usuario desea hacer una solicitud a su servicio de API para actualizar su dirección de correo electrónico, por lo que debe enviar una solicitud a su API, tal vez a /
/user/[email protected]
?/user/[email protected]
. - Para poder verificar la solicitud, el usuario agrega el ID de usuario y una firma a la llamada, por lo que la llamada se convierte en
/user/[email protected]&userid=123&sig=some_generated_string
- El servidor recibe la llamada, ve que es de userid = 123 y busca la clave de API para ese usuario. Luego replica los pasos para crear la firma a partir de los datos, y si la firma coincide, la solicitud es válida.
Esta metodología garantiza que la clave API nunca se envíe como parte de la comunicación .
Eche un vistazo a la función hash_hmac() PHP, es popular para enviar solicitudes firmadas. En general, le pones al usuario a hacer algo como poner todos los parámetros en una matriz, ordenar alfabéticamente, concatenar en una cadena y luego hash_hmac
esa cadena para obtener la sig. En este ejemplo, puede hacer:
$sig = hash_hmac("sha256",$params[''email''].$params[''userid''],$API_KEY)
A continuación, agregue ese $sig
en la URL REST como se mencionó anteriormente.
Estoy trabajando con phil sturgeon REST_Controller para codeigniter para crear una API REST, hasta ahora he podido crear una biblioteca simple para generar claves api para los usuarios. Mi problema ahora es enviar la clave de API a la API para cada solicitud, cómo lo hago sin tener que enviarlo manualmente para cada solicitud.
La idea de REST es que no tiene estado, así que no hay sesiones ni nada. Si desea autenticarse, aquí es donde entran las claves, y las claves se deben pasar para cada solicitud, y cada solicitud autentica al usuario (ya que REST no tiene estado, ¿mencioné eso?).
Hay varias maneras de pasar una llave. Puede pasarlo como un parámetro (es decir, http://example.com/api/resource/id?key=api_key ) o puede pasarlo como parte de los encabezados HTTP. He visto API que especifican que envíe su nombre de usuario, y una clave API como parte de la contraseña del encabezado de autorización de acceso básico de HTTP.
Una solicitud de ejemplo:
<?php
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => ''http://example.com/api/resource/id'',
CURLOPT_USERPWD => ''martinbean:4eefab4111b2a''
));
$response = curl_exec($ch);
Donde martinbean
sería el nombre de usuario de mi cuenta en su sitio web, y 4eefab4111b2a
sería mi clave API.