2014-02-13 5 views
6

Итак, я создаю REST API для веб-приложения, которое я разрабатываю, и я знаю, что основные способы аутентификации - либо отправлять учетные данные для каждого запроса, либо отправлять токен.Проверка подлинности CakePHP на API REST

Поскольку я раньше не использовал токен, я могу отправить учетные данные для каждого запроса. Дело в том, что я не могу найти примеров того, как справиться с этим в контроллере. Было бы что-то вроде этого?

public function api_index() { 
    if(!$this->Auth->login()) return; 

    $this->set(array(
     'models' => $this->Model->find('all'), 
     '_serialize' => array('models') 
    )); 
} 

Я не думаю, что это путь AuthComponent::login() работы, я могу получить некоторые направления здесь, пожалуйста?

ответ

1

AuthComponent :: login() создает переменную сеанса, которая хранит пользовательские данные, поэтому скажите, что у вас были данные, которые были чем-то вроде.

$data = array('User' => array('id' => 1, 'username' => 'johndoe')); 

Тогда вы будете использовать

$this->Auth->login($data); 

и получить доступ к данным с

$this->Auth->user('User'); 

Чтобы получить идентификатор пользователя

$this->Auth->user('User.id'); 

В вашем AppControllers beforefilter PUT $this->Auth->deny(); что будетзапретить все действия кому-то, кто не вошел в систему. Затем в каждом контроллере перед фильтром вы должны указать «вид», являющееся именем действия, которое вы хотите публиковать.

http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

+0

Благодарим вас за ответ. Мне было интересно узнать, как я могу аутентифицироваться при каждом действии, поскольку мобильное приложение, использующее API, не сможет поддерживать сеанс –

5

Хорошо, первое разъяснение о том, как AuthComponent :: Вход работ. В Cake 2.x этот метод не выполняет никакой проверки подлинности, а создает массив Auth.User в вашем сеансе. Вам необходимо реализовать собственно аутентификацию (модель User - это естественное место для этого). Базовый метод проверки подлинности может выглядеть так:

App::uses('AuthComponent', 'Controller/Component'); 
public function authenticate($data) { 
    $user = $this->find('first', array(
     'conditions' => array('User.login' => $data['login']), 
    )); 
    if($user['User']['password'] !== AuthComponent::password($data['password']) { 
     return false; 
    } 

    unset($user['User']['password']); // don't forget this part 
    return $user; 
    // the reason I return the user is so I can pass it to Authcomponent::login if desired 
} 

Теперь вы можете использовать это с любого контроллера при условии загрузки модели пользователя. Возможно, вы можете загрузить его, позвонив по номеру Controller::loadModel('User').

Если вы хотите проверить подлинность каждого запроса, то вы должны затем положить в методе beforeFilter из AppController:

public function beforeFilter() { 
    $this->loadModel('User'); 
    if(!$this->User->authenticate($this->request->data)) { 
     throw new UnauthorizedException(__('You don\'t belong here.')); 
    } 
} 

Все вышесказанное предполагает, что вы передаете значения POST для входа в систему и пароль каждый раз. Я думаю, что аутентификация маркера, безусловно, лучший способ пойти, но для того, чтобы встать и работать, это должно работать. Некоторые недостатки включают отправку пароля в cleartext (если вам не требуется ssl) каждый запрос и, вероятно, высокий уровень использования алгоритма хеширования каждый раз. Тем не менее, я надеюсь, что это даст вам лучшее представление о том, как сделать аутентификацию с помощью cakephp.

Сообщите мне, если что-то нуждается в уточнении.

Обновление: После публикации этого вопроса я выяснил, что вы можете использовать AuthComponent :: login без параметров, но я не поклонник этого. Из документации CakePHP:

In 2.x $this->Auth->login($this->request->data) will log the user in with 
whatever data is posted, whereas in 1.3 $this->Auth->login($this->data) 
would try to identify the user first and only log in when successful. 
1

CakePHP 2.X, После многих исследований об этом в Интернете я не нашел удовлетворительного ответа. Поэтому я нашел способ сделать это. Может быть, этот ответ поможет некоторым людям в будущем. Этот ответ применим только для API REST в cake php.

Добавить следующую строку в логике действия REST API перед проверкой для $this->Auth->login().

$this->request->data['User'] = $this->request->data ; 
if($this->Auth->login()){ 
    echo "Hurray You are logged In from REST API."; 
} 
else 
{ 
    throw new UnauthorizedException(__('You don\'t belong here.')); 
} 

: Как Дайте описание @threeve сказал в одном из ответов, которые $this->Auth->login() не делает никакого аутентификации. а скорее создает массив Auth.User в вашем сеансе. Для аутентификации мы требуем, чтобы наши данные $ this-> request-> находились внутри массива User, поскольку User является моделью, которая будет проверять учетные данные в базе данных. Поэтому мы должны передавать данные в Auth, как это требуется, если не использовать REST API. Остальные вещи будут обрабатываться самим Cake и Auth.

Любые улучшения или предложения по этому ответу являются наиболее желанными.

Смежные вопросы