REST用户认证(REST user authentication)

2019-07-18 17:51发布

OK ...的基本想法是有服务器和客户端物理上分开(两个系统)。

我的想法是建立一个独立的Web服务(REST,XML,API-KEY),将提供

  1. 认证:用户登录,注销
  2. 数据:获取产品清单

然后,我将创建不同的语言(闪光,PHP,JavaScript的)客户端。 数据将仅提供给认证用户。

用户Tipical通信获得的产品将是列表:

  1. (1个请求)登录/开始会话
  2. (1个请求)获取产品清单
  3. (1个请求)获取产品清单
  4. ...

好的...现在我的问题是用户会话。 说,我们要建立JavaScript客户端,我们其实有创建PHP客户端将与REST(PHP知道REST API-KEY),将转发信息为Javascript(客户端)右沟通? 用户将通过PHP登录REST服务器右侧,然后通过PHP请求数据,以REST服务器?

问题:

  • 现在怎么做PHP店信息关于REST服务器上打开用户会话?
  • 如果我的想法是坏,什么是执行的正确方法吗?
  • 备择方案?

Answer 1:

一个RESTful接口不存储有关特定用户会话的任何信息。 这是客户端的工作,以维护有关它是做什么的信息。

通过在授权HTTP头信息提供认证每个请求的用户。 如果这成为一个性能问题,然后再看其他解决方案来优化PERF。



Answer 2:

第一个问题:XmlHttpRequest的请求到服务仍然会沿着饼干,可以用来传递一个会话ID通过。 你甚至可以(假设终端用户的浏览器支持的话)标记饼干为“仅Http”,以减少您的XSS足迹。 见杰夫·阿特伍德的文章对一些细节。



Answer 3:

你或许应该使用HTTP认证用户身份验证,所以不需要做任何类型的会话管理。



Answer 4:

你不需要PHP来存储的API-KEY,如果你让你的客户端类在javascript足够聪明的追加API-KEY(登录时加载)到每个的XmlHttpRequest类将产生的标题。

此外,它可能是很好的注意,API-KEY并不一定意味着身份验证密钥。



Answer 5:

我面临同样的问题。 我在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);
   }


文章来源: REST user authentication