Я создаю REST API в PHP для работы с приложением на основе JavaScript. Все запросы обрабатываются как JSON, а некоторые запросы требуют аутентификации.
Пример запроса:
$.ajax({
type: 'GET',
url: 'http://domain.com/api/posts/recent.json',
headers: {
Authorization: 'X-TRUEREST ' + $.param({
username: 'johndoe',
password: '********'
})
},
success: function(response){
// Handle response here (includes auth errors too)
},
error: function(a,b,c) {
}
});
Я основал использование заголовков HTTP Authentication для кода в этом плагине: https://github.com/kvz/cakephp-rest-plugin/blob/master/Controller/Component/RestComponent.php#L532
Как вы можете видеть, они принимают переданные параметры с заголовком, а затем они используются для входа пользователя в систему, если они еще не были. Из того, что я могу сказать, они ожидают, что аутентификационные данные будут переданы с запросом на данные.
Примером этого является (обратите внимание не на использование CakePHP в моем примере приложения):
if ( $loggedIn ) { // logged in is true of false based on session existing
// Then return the JSON as normal
} else {
// Grab HEADERS INFO
$headers = $_SERVER['HTTP_AUTHORIZATION'];
$parts = explode(' ', $_SERVER['HTTP_AUTHORIZATION']);
// Then use the parts to find a user in the DB... and populate $user
if($user){
$this->Auth->login($user); // login the user with our authentication code
// Then return JSON as normal
} else {
print json_encode(array('auth'=>false))
}
}
Несколько вопросов, которые у меня есть:
Вопрос 1: Зачем использовать HTTP-аутентификацию и заголовки? Насколько я могу судить, они ничего мне не предлагают, если я неправильно их использую? Почему бы просто не пропустить имя пользователя и пароль в параметре данных JS?
Вопрос 2: Как уже говорилось ранее, я основывал свой дизайн API на плагине Cake выше, но из того, что я вижу, они ВСЕГДА передают имя пользователя и пароль с каждым запросом, а затем решают использовать его или нет, если пользователь вошел в систему. Правильно ли это? Для меня кажется более вероятным, что аутентификация и запросы на данные должны обрабатываться отдельно. В противном случае мне пришлось бы хранить имя пользователя и пароль в моем JavaScript где-нибудь, чтобы я мог отправлять его с каждым запросом.
Это подводит меня к следующему вопросу...
Вопрос 3:. Как узнать, вошел ли пользователь в систему? Я могу установить переменную в true, а затем передать это как часть моего JSON с каждым запросом, но может ли сеанс работать с внешним устройством?