Проверка подлинности Symfony REST API без sfGuardPlugin - PullRequest
0 голосов
/ 12 октября 2011

Я пытаюсь найти информацию о защите HTTP REST API в проекте Symfony, но все, что я могу найти, это информация об использовании sfGuardPlugin.Из того, что я вижу, этот плагин не очень полезен для веб-сервисов.Он пытается использовать модели профилей пользователей (которые не всегда так просты) и страницы «входа» и «выхода», которые, очевидно, не имеют смысла для API REST без состояния.Он делает намного больше, чем мне когда-либо понадобится, и я хочу сказать, что для простоты.

Я хочу знать, где реализовать свой собственный метод авторизации (слабо основанный на подходе Amazon S3).Я знаю, как я хочу, чтобы метод авторизации действительно работал, я просто не знаю, где я могу поместить код в мое приложение Symfony, чтобы оно выполнялось перед обработкой каждого запроса и позволяло подтвержденным запросам продолжаться, но неудачные запросы возвращали 403.

Есть идеи?Я не могу себе представить, что это сложно, я просто не знаю, с чего начать.

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Есть плагин для аутентификации RESTful -> http://www.symfony -project.org / plugins / sfRestfulAuthenticationPlugin

Не использовал его, хотя ....

Как, где вы планируете аутентифицировать пользователей?

В учебнике Jobeet используются токены ... http://www.symfony -project.org / jobeet / 1_4 / Doctrine / ru / 15

0 голосов
/ 23 января 2013

Вставьте HTTP-скрипт basicAuth в ваш _dev.php (Symfony 1.4 = <) между конфигурацией проекта "require" и созданием экземпляра конфигурации. </p>

Протестируйте его на своем dev.Если это работает, поместите код в ваш index.php (действительный эквивалент _dev.php) и отправьте его в живую.

Быстро и грязно, но это работает.Возможно, вы захотите защитить это имя пользователя / пароль в скрипте.

например

    $realm = 'Restricted area';

        //user => password
        $users = array('username' => 'password');

        if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
            header('HTTP/1.1 401 Unauthorized');
            header('WWW-Authenticate: Digest realm="'.$realm.
                   '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

            die('Text to send if user hits Cancel button');
        }

    // || !isset($users[$data['username']]

        // analyze the PHP_AUTH_DIGEST variable
        if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($users[$data['username']])) {
            header('HTTP/1.1 401 Unauthorized');
            header('WWW-Authenticate: Digest realm="'.$realm.
                   '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
            die('Wrong Credentials!');
        }

        // generate the valid response
        $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
        $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
        $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

        if ($data['response'] != $valid_response) {
            header('HTTP/1.1 401 Unauthorized');
            header('WWW-Authenticate: Digest realm="'.$realm.
                   '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
            die('Wrong Credentials!');
        }

// function to parse the http auth header
function http_digest_parse($txt)
{
    // protect against missing data
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();
    $keys = implode('|', array_keys($needed_parts));

    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        $data[$m[1]] = $m[3] ? $m[3] : $m[4];
        unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
}

// ****************************************************************************
// ok, valid username & password.. continue...
0 голосов
/ 14 октября 2011

Я нашел то, что искал, покопавшись в коде для sfHttpAuthPlugin .То, что я искал, был "Фильтр".Некоторые подробности и пример описаны в примере проекта Askeet .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...