Я столкнулся с той же проблемой. Я использовал restserver в php.
Конечно, трафик проходит через SSL-соединение.
Когда я хочу получить информацию об определенном пользователе, я должен сначала пройти аутентификацию на остальном сервере, прежде чем смогу получить его информацию. Хотелось бы узнать какие-нибудь лучшие подходы?
Аналогичный пост: Аутентификация RESTful
Хороший ресурс также 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);
}