Веб-службы Codeigniter

Я использую Codeigniter 1.7. У кого-нибудь есть опыт создания веб-сервисов с PHP, особенно в рамках CodeIgniter? Какие меры безопасности необходимо учитывать при внедрении веб-сервисов? Как обеспечить аутентификацию с помощью ключей API?

Любые идеи?

Ответы

Ответ 1

Это зависит от типа веб-сервиса, о котором вы спрашиваете. Например, веб-сервис будет демон? или типичный онлайн-сервис. Для любого из них вы должны реализовать тип RESTful. RESTful означает соединение без гражданства. Здесь используются ключи API; например, для идентификации пользователя.

К счастью, Codeigniter имеет множество библиотек и расширений. Пример таких библиотек может быть здесь: https://github.com/philsturgeon/codeigniter-restserver

Теперь для проблем безопасности: ключи API заменят сеансы или любое состояние. Вам нужно будет выполнить полную проверку api. Многие сайты, реализующие API, предлагают разные решения для одного и того же конечного результата.

Аутентификация с помощью ключей API проста. Вы проверите его против типа хранилища (базы данных).

Вот учебник с использованием codeigniter и связанной с ним библиотеки: http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/

Это может быть несколько расплывчато, но поскольку у вас нет каких-либо конкретных проблем или очевидных потребностей, трудно быть конкретным.

ИЗМЕНИТЬ:

В этом случае было бы лучше реализовать интерфейс RESTful, чтобы ваше приложение iphone также могло использовать все пользовательские функции, предоставляемые вашей службой. Лучшим способом было бы сделать все доступным одним способом. Это означает отсутствие разных контроллеров/моделей для соединений iphone и веб-соединений.

Итак, например, у вас может быть следующий контроллер:

<?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 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...;

      }
   }
}

?>

Теперь это всего лишь небольшой пример для выполнения этих типов запросов. Это может относиться к любому типу контроллера. Хотя здесь есть несколько вариантов. Вы можете каждый раз передавать апикию и тайну каждый раз и проверять ее при каждом запросе. Или у вас может быть какой-то белый список, который после того, как вы будете проверены в первый раз, когда каждый запрос после этого будет включен в белый список, а черный - наоборот.

Надеюсь, это поможет, Daniel

Ответ 2

<?php 
//First Create Api file in controller name Api.php
/*
api call in postman
login : 
    email , password
    http://localhost/demo/api/login
    https://prnt.sc/pbs2do
register (user): : 
    fullname , email ,  password , recipeunit
    http://localhost/demo/api/signup
    https://prnt.sc/pbs3cc

profile and list (user profile and all user ) : 
    View Profile : email, if all then pass blank  
http://localhost/demo/api/userlist


change password :  
    http://localhost/demo/api/change_password
    email ,password ,newpassword , conformnewpassword (if needed)
    https://prnt.sc/pbs3rt

*/

if(!defined('BASEPATH')) exit('No direct script access allowed');

require APPPATH . '/libraries/BaseController.php'; // this file will download first and pest in library

class Api extends BaseController
{
    /**
     * This is default constructor of the class
     */
    public function __construct()
    {
        parent::__construct();
       $this->load->model('api/signup_model','signup_model');
    }

    /**
     * Index Page for this controller.
     */
    public function index()
    {

    }
    public function signup() 
    {
        $this->signup_model->signup();
    }
    public function login()
    {
        $this->signup_model->login();
    }
    public function userlist()
    {
        $this->signup_model->userlist();
    }
    public function edit_user()
    {
        $this->signup_model->edit_user();
    }
    public function change_password()
    {
        $this->signup_model->change_password();
    }
    public function testpass()
    {
        $this->signup_model->testpass();
    }
}

// then create model in model folder create api folder create signup_model.php file 
//after that


if (!defined('BASEPATH')) exit('No direct script access allowed');

class Signup_model extends CI_Model {

    public function __construct() 
    {
        parent::__construct();
        $this->load->database(); /* load database library */

    }
    // User register (signin) process 
    public function signup($data = array())
    {
        // another db field update like dt_createddate  
        if(!array_key_exists('dt_createddate', $data)){
            $data['dt_createddate'] = date("Y-m-d H:i:s");
        }
        if(!array_key_exists('dt_updateddate', $data)){
            $data['dt_updateddate'] = date("Y-m-d H:i:s");
        }
        if(!array_key_exists('dt_updateddate', $data)){
            $data['dt_updateddate'] = date("Y-m-d H:i:s");
        }
        $data['var_fullname'] = $this->input->post('fullname');
        $data['var_email'] = $this->input->post('email');
        $data['var_password'] =getHashedPassword($this->input->post('password')) ;

        $data['int_recipeunit'] = $this->input->post('recipeunit');
       // if(!empty($data['var_fullname']) && !empty($data['var_email']) && !empty($data['var_password']) ){ }

        /* check emailid  all ready exist or not */
        $email_check=$this->input->post('email');
        $this->db->select('var_email');
        $this->db->from('tbl_user');
        $this->db->where('var_email', $email_check);
        $query = $this->db->get();

        $user = $query->result();
        if(!empty($user))
        {           
            echo "{\"status\" : \"404\",\"message\" : \"Email all ready register\",\"data\":".str_replace("<p>","",'{}'). "}";
        }
        else 
        {
            $insert = $this->db->insert('tbl_user', $data);
            if($insert){
            $this->db->select('var_email as email,var_fullname as fullname,dt_createddate as createdate');
            $insert_id = $this->db->insert_id();
            $query = $this->db->get_where('tbl_user', array('int_id' => $insert_id));
            echo "{\"status\" : \"200\",\"message\" : \"User added sucessfully\",\"data\":".str_replace("<p>","",json_encode($query->row_array())). "}";
            // return $this->db->insert_id();

            }else
            {
                $message="Something Wrong";
                echo "{\"status\" : \"400\",\"data\":".str_replace("<p>","",json_encode($message)). "}";
                // return false;
            }
        }

    }

    /* Login user   $email, $password*/
    function login()
    {
        $email=$this->input->post('email');
        $password=$this->input->post('password');
        $this->db->select('int_id,var_email,var_password');
        $this->db->from('tbl_user');
        $this->db->where('var_email', $email);
        $this->db->where('chr_status', 'A');
        $query = $this->db->get();

        $user = $query->result();
        if(!empty($user))
        {
            if(verifyHashedPassword($password, $user[0]->var_password))
            {
                $this->db->select('var_email as email,var_fullname as fullname,dt_createddate as createdate');
                $query = $this->db->get_where('tbl_user', array('var_email' => $email));
            echo "{\"status\" : \"200\",\"message\" : \"Login sucessfully\",\"data\":".str_replace("<p>","",json_encode($query->row_array())). "}";
            }
            else 
            {
                 echo "{\"status\" : \"404\",\"message\" : \"Password does not match\",\"data\":".str_replace("<p>","",'{}'). "}";
            }
        }
        else 
        {
            echo "{\"status\" : \"404\",\"message\" : \"Invalid email \",\"data\":".str_replace("<p>","",'{}'). "}";
        }
    }
    /* Fetch user data all or single    */
    function userlist()
    {
        $email=$this->input->post('email');  // post id of which user data you will get

        if(!empty($email))
        { 
            $email=$this->input->post('email');
            $password=$this->input->post('password');
            $this->db->select('int_id,var_email,var_password');
            $this->db->from('tbl_user');
            $this->db->where('var_email', $email);
            $this->db->where('chr_status', 'A');
            $query = $this->db->get();

            $user = $query->result();
            if(!empty($user))
            {       
                $this->db->select('var_email as email,var_fullname as fullname,dt_createddate as createdate');  
                $query = $this->db->get_where('tbl_user', array('var_email' => $email));
                $responce_json=json_encode($query->row_array());
                echo "{\"status\" : \"200\",\"message\" : \"User data\",\"data\":".str_replace("<p>","",$responce_json). "}";
            }
            else
            {
                 echo "{\"status\" : \"404\",\"message\" : \"Invalid email \",\"data\":".str_replace("<p>","",'{}'). "}";
            }
        }
        else
        {
            $this->db->select('var_email as email,var_fullname as fullname,dt_createddate as createdate');
            $query = $this->db->get('tbl_user');
            $responce_json=json_encode($query->result_array());
            echo "{\"status\" : \"200\",\"message\" : \"User data\",\"data\":".str_replace("<p>","",$responce_json). "}";
        }
    } 

    /*  Update user data   */
     function edit_user($data = array()) {

            $id = $this->input->post('id');
            $data['first_name'] = $this->input->post('first_name');
            /* $data['last_name'] = $this->input->post('last_name');
            $data['email'] = $this->input->post('email');
            $data['phone'] = $this->input->post('phone'); */
        if(!empty($data) && !empty($id)){
            if(!array_key_exists('modified', $data)){
                $data['modified'] = date("Y-m-d H:i:s");
            }

            $update = $this->db->update('users', $data, array('id'=>$id));
            if($update){
            $message="User Update Sucessfully";
            $responce_json=json_encode($message); 
            echo "{\"status\" : \"200\",\"data\":".str_replace("<p>","",$responce_json). "}";
            }

        }
        else
        {
            return false;
        }
    } 
    /* change password  */
    function change_password()
    {

        $email=$this->input->post('email');
        $password=$this->input->post('password');
        $newpassword=$this->input->post('newpassword');
        //$conformnewpassword=$this->input->post('conformnewpassword');
        $this->db->select('int_id,var_email,var_password');
        $this->db->from('tbl_user');
        $this->db->where('var_email', $email);
        $this->db->where('chr_status', 'A');
        $query = $this->db->get();

        $user = $query->result();
        if(!empty($user))
        {
            if(verifyHashedPassword($password, $user[0]->var_password))
            {
                //if($newpassword==$conformnewpassword)
                //{
                    $data['var_password'] = getHashedPassword($newpassword);
                    $update = $this->db->update('tbl_user', $data, array('var_email'=>$email));
                    $this->db->select('var_email as email,var_fullname as fullname,dt_createddate as createdate');
                    $query = $this->db->get_where('tbl_user', array('var_email' => $email));
                    echo "{\"status\" : \"200\",\"message\" : \"Password change sucessfully\",\"data\":".str_replace("<p>","",json_encode($query->row_array())). "}";
                /* }
                else
                {
                    echo "{\"status\" : \"404\",\"message\" : \"New pass and conform pass does not match \",\"data\":".str_replace("<p>","",'{}'). "}"; 
                } */
            }
            else 
            {
                 echo "{\"status\" : \"404\",\"message\" : \"Invalid old password \",\"data\":".str_replace("<p>","",'{}'). "}";
            }
        }
        else 
        {
            echo "{\"status\" : \"404\",\"message\" : \"Invalid email \",\"data\":".str_replace("<p>","",'{}'). "}";
        }
    }

    /*
     * Delete user data
     */
    /* public function delete($id){
        $delete = $this->db->delete('users',array('id'=>$id));
        return $delete?true:false;
    } */

}

 ?>