我有一个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会话会话并避免不提供会话密钥。 在我登录之前,该应用程序运行正常。