2015-01-16 2 views
1

У меня есть приложение для Symfony2, у которого есть механизм входа.Symfony2 Аутентификация через HTTP-заголовки

Однако мне нужно каким-то образом отправить запрос из другого приложения, который проверяет, существует ли запрошенный URL в этой системе:

Например, есть запрос http://myapp/order/1111, что мне нужно проверить, возвращает ли он 200 OK заголовка или 404 Not Found статуса ;

Когда я отправляю запрос, он несанкционирован, и его перенаправляют на страницу входа/логин, которая возвращает заголовок состояния 200 OK.

Что мне нужно, так или иначе безопасно обходить логин. Есть ли способ, чтобы я мог добавить учетные данные для запроса или создать дополнительный метод входа?

EDIT:

Как было предложено в комментариях, я пытался использовать завиток. Но я не могу понять, как это работает. Вот что я получил, но это не работает.

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'http://localhost/en/login'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6'); 
curl_setopt($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); 
curl_setopt($ch, CURLOPT_POST, true); 
$html = new DOMDocument(); 
$html->loadHTML(curl_exec($ch)); 

if (curl_error($ch)) { 
    echo(curl_error($ch)); 
} 
$csrf_token = $html->getElementById('csrf_token')->getAttribute('value'); 

curl_setopt($ch, CURLOPT_URL, 'http://localhost/en/login'); 
//curl_setopt($ch, CURLOPT_REFERER, 'http://localhost/en/login'); 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
    '_username' => 'login_username', 
    '_password' => 'login_password', 
    '_remember_me' => 'on', 
    '_csrf_token' => $csrf_token 
))); 

curl_setopt($ch, CURLOPT_POST, true); 
$result = curl_exec($ch); 

if (curl_error($ch)) { 
    echo(curl_error($ch)); 
} 

echo $result; 

curl_close($ch); 

Любые предложения, как работать с завитком на этом случае?

+0

Не лучше ли получить другое ваше приложение разрешено перед проверкой URL? – smarber

+0

Я согласен с @smarber. Кстати, если вы хотите, чтобы что-то простое делалось, как описано в следующем примере: http://php-and-symfony.matthiasnoback.nl/2012/07/symfony2-security-using-advanced-request-matchers-to -activate-брандмауэров /. Вы можете просто активировать брандмауэр только в том случае, если в запросе нет настраиваемого заголовка, который вы можете просто добавить на свой сервер. Недостатком является безопасность, но это зависит от приложения тура – erlangb

+0

Я не знаю, как мне разрешить другое приложение? –

ответ

0

Я написал решение этой проблемы, если кто-то борется с этим:

$ch = curl_init(); 

//get login form 
curl_setopt($ch, CURLOPT_URL, $login_url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6'); 
curl_setopt($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_path); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_path); 

//parse html to get csrf_token, I added id attribute to it for easier retrieving 
$html = new DOMDocument(); 
$html->loadHTML(curl_exec($ch)); 
$csrf_token = $html->getElementById('csrf_token')->getAttribute('value'); 

if (curl_error($ch)) { 
    throw new Exception(curl_error($ch)); 
} 

//send post request to login_check with parameters (csrf_token included) 
curl_setopt($ch, CURLOPT_URL, $check_url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
    '_username' => $username, 
    '_password' => $password, 
    '_remember_me' => 'on', //if you use remember me functionality 
    '_csrf_token' => $csrf_token 
))); 

curl_exec($ch); 
if (curl_error($ch)) { 
    throw new Exception(curl_error($ch)); 
} 

//request login protected urls 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, false); 

curl_exec($ch); 

if (curl_error($ch)) { 
    throw new Exception(curl_error($ch)); 
} 

$info = curl_getinfo($ch); 
curl_close($ch); 

//I used this code in a function returning url and http_code for further processing 
return array(
    'url' => $info['url'], 
    'http_code' => $info['http_code'] 
); 

У меня была проблема с локализацией. Я использовал для того чтобы пройти login_check url с locale как это http://localhost/en/login_check, удалив местонахождение я исправил проблему: http://localhost/login_check

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