OK ...的基本想法是有服务器和客户端物理上分开(两个系统)。
我的想法是建立一个独立的Web服务(REST,XML,API-KEY),将提供
- 认证:用户登录,注销
- 数据:获取产品清单
然后,我将创建不同的语言(闪光,PHP,JavaScript的)客户端。 数据将仅提供给认证用户。
用户Tipical通信获得的产品将是列表:
- (1个请求)登录/开始会话
- (1个请求)获取产品清单
- (1个请求)获取产品清单
- ...
好的...现在我的问题是用户会话。 说,我们要建立JavaScript客户端,我们其实有创建PHP客户端将与REST(PHP知道REST API-KEY),将转发信息为Javascript(客户端)右沟通? 用户将通过PHP登录REST服务器右侧,然后通过PHP请求数据,以REST服务器?
问题:
- 现在怎么做PHP店信息关于REST服务器上打开用户会话?
- 如果我的想法是坏,什么是执行的正确方法吗?
- 备择方案?
一个RESTful接口不存储有关特定用户会话的任何信息。 这是客户端的工作,以维护有关它是做什么的信息。
通过在授权HTTP头信息提供认证每个请求的用户。 如果这成为一个性能问题,然后再看其他解决方案来优化PERF。
第一个问题:XmlHttpRequest的请求到服务仍然会沿着饼干,可以用来传递一个会话ID通过。 你甚至可以(假设终端用户的浏览器支持的话)标记饼干为“仅Http”,以减少您的XSS足迹。 见杰夫·阿特伍德的文章对一些细节。
你或许应该使用HTTP认证用户身份验证,所以不需要做任何类型的会话管理。
你不需要PHP来存储的API-KEY,如果你让你的客户端类在javascript足够聪明的追加API-KEY(登录时加载)到每个的XmlHttpRequest类将产生的标题。
此外,它可能是很好的注意,API-KEY并不一定意味着身份验证密钥。
我面临同样的问题。 我在PHP中使用restserver。 Ofcourse交通越过SSL连接。
当我想获得关于某个用户的信息,我必须先进行身份验证到其他服务器之前,我可以得到他的信息。 我想知道有什么更好的方法?
类似的帖子: REST风格的认证良好的资源也OAuth2用户 。 此外谷歌使用OAuth:
的OAuth 2.0是所有谷歌API的一个新的,简化的授权协议。 的OAuth 2.0依靠SSL的安全,而不需要你的应用程序直接进行加密签名。 该协议允许应用程序请求访问与用户的谷歌帐户相关的数据。
当应用程序使用此: HTTP:// restserver /用户/登录 ,让我们说,认证就ok了,应用程序本身产生这样的会议:
REST客户端/应用
public function login() {
.... form_validation
// get restserver salt so we can send hashed password
$message = $this->rest->get('https://restserver/user/salt');
if($message['status_code'] !== '0')
exit;
$data = array(
'username' => $this->input->post('username'),
'password' => prepare_password_salt($this->input->post('password'), $message['salt'])
);
// authenticate with restserver, check if the user and password exist
$msg = $this->rest->post('https://restserver/user/login', $data);
if($msg['status_code'] === '0')
{
// make session
$session_data = array(
'logged_in' => true,
'username' => $data['username']
);
$this->session->set_userdata($session_data);
redirect(base_url() . 'some_page');
REST服务器
/**
* http://restserver/user POST
* - insert new user
*
* http://restserver/user/id PUT
* - update existing user
*
* http://restserver/user/login POST
* - check if username exists and the password match
*
* - return true on success login
* - return false on failure
*
* http://restserver/user/id/hashed_pass GET
* again client gets salt and then send hashed_pass
* - return array(
* 'username' ..
* 'email' ....
* .. other information
* );
* or we could use some access token but that means that the restserver
* must save token for each user for some time and then delete
*
* HTTP server Allowed methods: GET, POST, PUT
* HTTP server disallowed methods: DELETE
**/
class User extends Rest_Controller
{
public function __construct()
{
parent::__construct();
$this->load->library('form_validation');
}
/**
* Check username and password with database.
*
* @link /
* @param $_POST['username'] (string)
* @param $_POST['password'] (string - sha1(password . salt))
* @return array which contains
* array['status_code']
* array['status']
* status_code 0 means that login was successful
* status_code 1 means that username or password is incorrect
*/
public function login_post()
{
$this->load->model('User_Model', 'user_model');
$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[3]|max_length[64]');
$this->form_validation->set_rules('password', 'Password', 'trim|required|exact_length[40]');
if($this->form_validation->run() === true)
{
// check with the database
if($this->user_model->authenticate($this->input->post('username'), $this->input->post('password')))
{
// update user last_login field
$this->user_model->updateLogin($this->input->post('username'));
$message = array(
'status_code' => '0',
'status' => 'Login ok.'
);
}
else
{
$message = array(
'status_code' => '1',
'status' => 'Username or password is incorrect.'
);
}
}
$this->response($message, 200);
}