DİNLENME kullanıcı doğrulama

6 Cevap php

Tamam ... temel fikir sunucu ve istemci fiziksel (iki sistemleri) ayrılmış olmasıdır.

Benim fikrim sağlayacak bir stve-alone web servisi (REST, XML, API-KEY) inşa etmek

  1. Kimlik Doğrulama: Kullanıcı girişi, çıkış
  2. Veri: ürünlerin listesini alın

Sonra farklı dilde (Flash, PHP, JavaScript) müşterilerine yaratacaktır. Veriler sadece kimliği doğrulanmış kullanıcılara sunulacaktır.

Ürünlerin listesini almak için kullanıcı için Tipical iletişim olacaktır:

  1. (1 istek) Giriş / oturumu başlatmak
  2. (1 istek) ürünlerin listesini alın
  3. (1 istek) ürünlerin listesini alın
  4. ...

Tamam ... Şimdi var sorun kullanıcı oturumu. Biz JavaScript istemci oluşturmak istiyorsanız söyleyin, biz aslında (PHP DİNLENME API KEY bilir) ve sağ JavaScript (istemci) bilgisi iletecek REST ile iletişim kuracak PHP istemci oluşturmak için var? Kullanıcı sunucu hakkını REST PHP ile giriş ve ardından sunucuyu REST PHP üzerinden veri talep edecektir?

Sorular:

  • Şimdi nasıl PHP mağaza bilgiler DİNLENME sunucuda kullanıcı oturumunu açtı mı?
  • Benim fikrim kötüyse, uygulama doğru yolu nedir?
  • Alternatifleri?

6 Cevap

Bir sığınakta arabirimi belirli bir kullanıcının oturumu hakkında herhangi bir bilgi deposu değildir. O ne yaptığını hakkında bilgi korumak için müşterinin işidir.

Yetkilendirme HTTP başlığında bilgi vererek her istek üzerine kullanıcının kimliğini doğrulamak. IF Bu bir performans sorunu haline gelir, sonra perf optimize etmek için alternatif çözümler bakmak.

İlk soru: Bir servise XmlHttpRequest istekler hala bir oturum kimliğini yaymak için kullanılabilecek, kurabiye boyunca geçecek. Hatta XSS ayak izini azaltmak için 'HttpOnly' olarak işaretleyiniz çerezleri (Enduser tarayıcı destekliyorsa varsayarak) olabilir. Bu konuda bazı ayrıntı için Jeff Atwood's article bakın.

Muhtemelen kullanıcı kimlik denetimiyle HTTP kimlik doğrulaması kullanır ve böylece oturum yönetimi herhangi bir sıralama yapmak gerekmez.

Eğer müşteri sınıfları yaparsanız bir API KEY saklamak PHP gerekmez sınıf doğacaktır her xmlHTTPrequest başlıklarını içine (giriş yaparken yüklenen) API-KEY eklemek için yeterince akıllı javascript.

Ayrıca bu API KEY gerekli ortalama doğrulama anahtarı yok dikkat iyi olabilir.

I'm facing the same problem. I used restserver in php. Ofcourse the traffic goes over SSL connection.

Belirli bir kullanıcı hakkında bilgi almak istiyorum ne zaman onun bilgi alabilirsiniz önce kalan sunucuya ilk kimlik doğrulaması gerekir. Ben daha iyi yaklaşımlar bilmek istiyorsunuz?

Similar post: RESTful Authentication Good resource is also OAuth2. Also Google uses oauth:

OAuth 2.0 Tüm Google API'leri için yeni, basitleştirilmiş yetkilendirme protokolüdür. OAuth 2.0 yerine doğrudan kriptografik imzalama yapmak için uygulama gerektiren güvenlik için SSL dayanır. Bu protokol uygulaması, bir kullanıcının Google Hesabı ile ilişkili verilere erişim istemek için izin verir.

Uygulama bu kullandığında: http://restserver/user/login ve en kimlik Tamam gitti diyelim, uygulamanın kendisi bu gibi oturumu oluşturur:

Rest client/Application

    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 Server

/**
 * 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);
   }

Sen kaynak olarak oturumları işleyebilir:

POST /sessions {email, password}
-> {userId, token}

Bundan sonra (çünkü CSRF kurabiye kötü) kullanıcıyı tanımlamak için geri http başlığında belirteci gönderebilirsiniz. Belirteç yapabilir php tek şey mcrypt_create_iv, öngörülemez olmalıdır.

Sen / oturumları son nokta olmadan benzer bir şey yapar temel http auth kullanabilirsiniz. Eğer yönlendirici sınıf çalıştırmadan önce bu kodu eklemek zorunda.

Başkası kısıtlı izinleri ile müşterilerine yaparsa, facebook uygulamaları, örneğin daha sonra örnek OAuth için bir üçüncü taraf yetkilendirme çözümü uygulamak zorunda.

note: You should use SSL to prevent man in the middle attacks.