Подтвердить что ты не робот

Обработка аутентификации для запросов API JSON в плагине CakePHP REST

Я пытаюсь создать API для своего приложения CakePHP, используя плагин REST: https://github.com/kvz/cakephp-rest-plugin

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

Чтобы предотвратить дублирование, плагин настроен, как описано в предыдущем вопросе: CakePHP REST Plugin не возвращает данные, который теперь исправлен и работает.

Следующая часть обрабатывает аутентификацию. Я добавил следующее к моему методу beforeFilter, который в основном должен сказать, если это вызов для отдыха, и пользователь не вошел в систему (обратите внимание: что не все методы требуют входа пользователя в систему), а затем запишите их.

if (!$this->Auth->user()) {

            if ($this->Rest->isActive()) {   

                $loginUser = $this->User->loginUser(
                    $credentials['username'],
                    AuthComponent::password($credentials['password'])
                );

                if($loginUser) {                        
                    if (!$this->Auth->login($loginUser['User'])) {
                        $msg = sprintf('Unable to log you in with the supplied credentials. ');
                        return $this->Rest->abort(array('status' => '403', 'error' => $msg));
                    }
                }

            }
        }

и для тех, кто хочет увидеть вызов модели:

 public function loginUser($usernameOrEmail, $password)
    {
        return $this->find('first', array(
            'conditions' => array(
                'OR' => array(
                    'User.email' => $usernameOrEmail,
                    'User.username' => $usernameOrEmail,
                    'User.phone' => $usernameOrEmail
                ),
                'User.password' => $password
            ),
            'recursive' => -1
        ));
    }

Однако я не могу заставить его работать. Я делаю запрос, например, для тестирования:

    $.ajax({
        url: 'http://domain.com/users/test.json',
        dataType: 'jsonp',
        data: { username: 'test', password: 'test' },
        headers: {
            Authorization: "TRUEREST"
        },
        success: function(response) {
            console.log(resonse);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            console.log(jqXHR, textStatus, errorThrown);
        }
    });

Вот три основных вопроса, которые я имею здесь:

  • Я вручную передаю имя пользователя и пароль здесь, но часть заголовков правильная? Объяснение относительно этого довольно расплывчато по документации для этого здесь: https://github.com/kvz/cakephp-rest-plugin#authorization

  • Будет ли $credentials['username'] собирать его? Является ли $credentials глобальной вещью с проверкой подлинности HTTP или я что-то пропустил?

  • Собираетесь ли вы регистрировать пользователя каждый раз, когда они делают запрос? Как это кажется немного грязным, если это дело.

Текущие ошибки реализации кода с помощью: Uncaught SyntaxError: Unexpected token :

и вот вывод JSON, который отлично выглядит для меня...

{
    "data": {
        "User": []
    },
    "meta": {
        "status": "error",
        "feedback": [{
            "message": "Log in to continue",
            "level": "error"
        }],
        "request": {
            "http_host": "domain.com",
            "http_user_agent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit\/537.22 (KHTML, like Gecko) Chrome\/25.0.1364.29 Safari\/537.22",
            "server_addr": "##.##.###.###",
            "remote_addr": "##.###.###.###",
            "server_protocol": "HTTP\/1.1",
            "request_method": "GET",
            "request_uri": "\/users\/test.json?callback=jQuery172015279368730261922_1358207116601&username=test&password=test123&_=1358207116611",
            "request_time": 1358207116
        },
        "credentials": {
            "class": null,
            "apikey": null,
            "username": null
        },
        "time_epoch": "1358207117",
        "time_local": "Mon, 14 Jan 2013 15:45:17 -0800",
        "version": "0.3"
    }
}
4b9b3361

Ответ 1

Ваши проблемы многочисленны и охватывают широкий круг вопросов. Я укажу вам во всех направлениях, где я вижу проблемы. Самая большая проблема, которую вы можете обнаружить, заключается в том, что пользователь не найден. Это связано с тем, что, если вы не устанавливаете $credentials в другом месте кода, они не устанавливаются.

Отсутствующие учетные данные

Я не вижу, что вы устанавливаете переменную $credentials в любом месте. Опция data в .ajax передается как запрос GET. Возможно, вам потребуется обновить с $credentials['var'] до $_GET['var']. Если я правильно помню, они также могут быть найдены в $this->data->params['username'] и $this->data->params['password'].

Что делать, если пользователь не является Auth'd

Я вижу ваш if (!$this->Auth->user()), и я вижу, где вы пытаетесь вытащить информацию о пользователе, но логика кажется, что это позволит неавторизованному пользователю пройти. Возможно, вам захочется взглянуть на эту логику немного больше. Вот что я буду делать:

if ($this->Rest->isActive()) {
     $user = $this->User->loginUser(
          $_GET['username'],
          AuthComponent::password($_GET['password'])
     );

     if (!$this->Auth->login($user)) {
          $msg = sprintf('Unable to log you in with the supplied credentials. ');
          return $this->Rest->abort(array('status' => '403', 'error' => $msg));
     }
} else {
     // handle the non-rest request
}