2012-03-14 18 views
15

Estoy usando Codeigniter 1.7. ¿Alguien tiene alguna experiencia en la creación de servicios web con PHP, particularmente dentro del framework CodeIgniter? ¿Qué deben considerar las medidas de seguridad al implementar servicios web? ¿Cómo proporcionar autenticación con claves API?Codeigniter web services

¿Alguna idea?

Respuesta

16

Depende del tipo de servicio web que solicite. ¿El servicio web va a ser un daemon, por ejemplo? o un servicio web típico en línea. Para cualquiera de estos debe implementar un tipo RESTful. RESTful significa una conexión sin estado. Aquí es donde se usan las claves API; para identificar a un usuario, por ejemplo.

Afortunadamente Codeigniter es uno con muchas bibliotecas y extensiones. Un ejemplo de tales bibliotecas puede estar aquí: https://github.com/philsturgeon/codeigniter-restserver

Ahora, por cuestiones de seguridad: las claves API reemplazarían las sesiones o cualquier estado. Tendría que hacer comprobaciones completas de la API. Muchos sitios que implementan API ofrecen diferentes soluciones para el mismo resultado final.

La autenticación con claves de API es simple. Lo verificaría contra un tipo de almacenamiento (base de datos).

Aquí hay un tutorial usando CodeIgniter y la biblioteca vinculada con anterioridad: http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/

Esto podría ser un tanto vaga, pero ya que no tiene ningún problema específico o aparentes necesidades es difícil ser específico.

EDIT:

En ese caso, sería mejor implementar una interfaz REST para que su aplicación para el iPhone también se puede utilizar todas las funcionalidades de usuario que proporciona su servicio. La mejor manera sería hacer que todo sea accesible de una manera. Es decir, no tener diferentes controladores/modelos para las conexiones de iphone y conexiones web.

Así, por ejemplo, usted podría tener el siguiente controlador:

<?php 

class Auth extends CI_Controller{ 

    public function login(){ 
     //Check if their accessing using a RESTful interface; 
     $restful = $this->rest->check(); 
     if($restful){ 
     //Check for the API keys; 
     $apiKey = $this->input->get('apiKey'); 
     $secretKey = $this->input->get('secretKey'); 

     //If you have any rules apon the keys you may check it (i.e. their lengths,     
     //character restrictions, etc...) 
     if(strlen($apiKey) == 10 and strlen($secretKey) == 14) 
     { 
      //Now check against the database if the keys are acceptable; 
      $this->db->where('apiKey', $apiKey); 
      $this->db->where('secretKey', $secretKey); 
      $this->db->limit(1); 
      $query = $this->db->get('keys'); 
      if($this->db->count_all_results() == 1) 
      { 
      //It's accepted the keys now authenticate the user; 
      foreach ($query->result() as $row) 
      { 
       $user_id = $row->user_id; 
       //Now generate a response key; 
       $response_key = $this->somemodel->response_key($user_id); 
       //Now return the response key; 
       die(json_encode( array(
             'response_key' => $response_key, 
             'user_id' => $user_id 
            ) 
           ) 
        ); 

      } //End of Foreach 
      }//End of Result Count 
     }//End of length/character check; 
     } else { 
     //Perform your usual session login here...; 

     } 
    } 
} 

?> 

Ahora bien, esto es sólo un pequeño ejemplo para la realización de este tipo de solicitudes. Esto podría aplicarse a cualquier tipo de controlador. Aunque hay algunas opciones aquí. Puede hacer que cada solicitud pase el apikey y el secreto cada vez y verificarlo en cada solicitud. O bien, podría tener algún tipo de lista blanca que una vez que haya sido verificado la primera vez que cada solicitud posterior se incluiría en la lista blanca y/o en la lista negra en el caso contrario.

Espero que esto ayude, Daniel

+0

Gracias Daniel.I've Una web application.I quieren implementar aplicaciones móviles (iPhone) para mi aplicación mediante el uso de los servicios web. Entonces, ¿puedes sugerirme alguna idea? – siva565

+0

Actualización de mi respuesta. – Daniel