我在请求设备API时如何绕过Web会话密钥

时间:2017-01-17 11:00:15

标签: php codeigniter

我有一个Web应用程序和一个ios应用程序(不是由我制作的,我不能在那里进行任何代码更改),但是它们都使用相同的后端来获取数据(这是其中的部分)如果在codeigniter框架上用php编写,我有访问权限)后端部分。 当我在网站上登录时,我使用了登录控制器和一个钩子来传递我所有控制器上的会话。

这是登录方:

public function login_validation() {
    $this->load->library('form_validation');
    $this->form_validation->set_rules('username','Username',
        'required|trim|callback_validate_credentials');
    $this->form_validation->set_rules('password','Password','required|trim');

    if ($this->form_validation->run()) {
        $data= array(
            'username'=> $this->input->post('username'),
            'is_logged_in' => true
        );
        $this->session->set_userdata($data);
        redirect('Monitor');
    } else {
        $this->load->view('login');
    }
}

这是我的钩子:

<?php
class Authenticate {
    protected $CI;

    public function __construct() {
        $this->CI = &get_instance();
    }

    public function check_user_login() {
        $isLoginRequested = $this->_endsWith(base_url(uri_string()), "Main/login");
        $isLoginValidating = $this->_endsWith(base_url(uri_string()), "Main/login_validation");

        // echo  $this->CI->session->userdata('is_logged_in') ;
        if(false == $this->CI->session->userdata('is_logged_in') && 
              $isLoginRequested == false && $isLoginValidating == false) {
            redirect('Main/login');    
        }
    }

    function _endsWith($haystack, $needle) {
        $length = strlen($needle);
        if ($length == 0) {
            return true;
        }
        return (substr($haystack, -$length) === $needle);
    }
}
?>

现在,ios设备上的登录请求api上的标题X-SESSION-KEY。在这个api:

public function types() {
    $userSession = $this->_get_user_session();
    $reqLanguage = $this->input->get_request_header('Accept-Language');

    if ($userSession != null) {
        if ($userSession->isLoggedIn() == true) {
            $this->_issue_success($this->ptypes->getAll($reqLanguage));
        } else {
            $this->_issue_respond_with_reason("The provided session is invalid.", HttpResponse::Forbidden);
        }
    } else {
        $this->_issue_respond_with_reason("No session key supplied.", HttpResponse::Forbidden);
    }

但现在发生了什么,在同一个URL上(就像我告诉两个应用程序都在使用相同的后端)我的ios应用程序正在请求Web会话而不是API端,我将在登录时重定向。 在那个URL上(在ios应用程序上)我得到:

{"reason":"No session key supplied."}

我的控制器没有发送任何数据。 我的问题是,当用户(从ios登录)请求API会话端时,如何在登录控制器端创建if变量,绕过我的Web会话会话并避免不提供会话密钥。 在我登录之前,该应用程序运行正常。

0 个答案:

没有答案