Аутентификация пользователя REST

Хорошо … основная идея состоит в том, чтобы иметь СЕРВЕР и КЛИЕНТ физически разделенные (две системы).

Моя идея – создать автономный веб-сервис (REST, XML, API-KEY), который обеспечит

  1. Аутентификация: вход в систему, выход из системы
  2. Данные: Получить список продуктов

Затем я буду создавать клиентов на разных языках (Flash, PHP, JavaScript). Данные будут обслуживаться только для аутентифицированных пользователей.

Типичная связь для пользователя для получения списка продуктов будет:

  1. (1 запрос) Вход / начало сеанса
  2. (1 запрос) Получить список продуктов
  3. (1 запрос) Получить список продуктов

ОК … Теперь проблема у меня – это сеанс пользователя. Предположим, что мы хотим создать Javascript-клиент, нам действительно нужно создать PHP-клиент, который будет связываться с REST (PHP знает о REST API-KEY) и перенаправляет информацию в Javascript (CLIENT)? Пользователь запустится через PHP для REST-сервера, а затем запросит данные через PHP для сервера REST?

Вопросов:

  • Как PHP хранит информацию об открытии пользовательского сеанса на сервере REST?
  • Если моя идея плоха, каков правильный способ реализации?
  • Альтернативы?

Интерфейс RESTful не хранит никакой информации о сеансе конкретного пользователя. Работа клиента заключается в том, чтобы поддерживать информацию о том, что он делает.

Аутентификация пользователя по каждому запросу путем предоставления информации в заголовке HTTP авторизации. ЕСЛИ это становится проблемой производительности, а затем посмотрите на альтернативные решения для оптимизации perf.

К вашему первому вопросу: запросы XmlHttpRequest к службе будут передаваться вместе с кукисами, которые могут использоваться для распространения идентификатора сеанса. Вы даже можете (при условии, что браузер этого пользователя поддерживает его) маркируют файлы cookie как «HttpOnly», чтобы уменьшить объем вашего XSS. См. Статью Джеффа Этвуда о некоторых подробностях.

Вероятно, вы должны использовать HTTP-аутентификацию для пользователя auth и поэтому не нужно выполнять какое-либо управление сеансом.

Вам не нужен PHP для хранения API-KEY, если вы сделаете свои классы клиентов в javascript достаточно умными, чтобы добавить API-KEY (загружаемый при входе в систему) в заголовки каждого XmlHttpRequest, который будет создан вашим классом.

Также неплохо было бы отметить, что API-ключ не требует наличия ключа аутентификации.

У меня такая же проблема. Я использовал restserver в php. Конечно, трафик проходит через SSL-соединение.

Когда я хочу получить информацию об определенном пользователе, я должен сначала пройти аутентификацию на сервере остального, прежде чем я смогу получить его информацию. Хотелось бы узнать какие-нибудь лучшие подходы?

Похожие сообщения: RESTful Authentication Хороший ресурс – также OAuth2 . Также Google использует oauth:

OAuth 2.0 – это новый, упрощенный протокол авторизации для всех API Google. OAuth 2.0 полагается на SSL для обеспечения безопасности, вместо того чтобы требовать, чтобы ваше приложение выполняло криптографическое подписание напрямую. Этот протокол позволяет вашему приложению запрашивать доступ к данным, связанным с учетной записью пользователя Google.

Когда приложение использует это: http: // restserver / user / login и предположим, что аутентификация прошла нормально, само приложение создает сеанс следующим образом:

Клиент отдыха / приложение

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'); 

Сервер отдыха

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