2017-02-14 26 views
2

Прямо сейчас у меня проблема с CORS (совместное использование ресурсов между разными источниками), особенно при попытке отправить авторизацию на slim api. Я попытался удалить заголовок авторизации на jquery, он работает как шарм! Но мне нужна авторизация, чтобы передать ключ api, который я не знаю, как обойти режим предполета (OPTIONS). Вот код javascript.Заголовок заголовка предварительной проверки во время CORS на основе Slim

$.ajax({ 
    type:'GET', 
    url:baseApi+'/code/account', 
    crossDomain:true, 
    xhrFields:{ 
     withCredentials:true 
    }, 
    beforeSend:function(xhr){ 
     $overlay.css('display','block'); 
     xhr.setRequestHeader("Authorization",boot._header); 
    }, 
    complete:function(xhr){ 
     // complete scope   
    } 
}); 

На тонкой структуры, я поставил Access-Control-Allow-Origin с белый список доменов происхождения (www.example.com). Вот полная конфигурация

if (isset($_SERVER['HTTP_ORIGIN'])) { 
    if($_SERVER['HTTP_ORIGIN'] == "http://www.example.com"){ 
     header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
    } 
    header('Access-Control-Allow-Credentials: true'); 
    header('Access-Control-Max-Age: 86400'); // cache for 1 day 
} 

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 
     header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); 

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
     header("Access-Control-Allow-Headers: Authorization, authorization, Content-Type"); 
} 

А вот полный запрос и заголовки ответов

Response Headers

HTTP/1.1 404 Not Found 
Date: Tue, 14 Feb 2017 14:44:34 GMT 
Server: Apache/2.4.23 (Unix) OpenSSL/1.0.2h PHP/5.6.24 mod_perl/2.0.8-dev Perl/v5.16.3 
X-Powered-By: PHP/5.6.24 
Access-Control-Allow-Origin: http://www.example.com 
Access-Control-Allow-Credentials: true 
Access-Control-Max-Age: 86400 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Headers: Authorization, authorization 
Content-Length: 514 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html;charset=UTF-8 

Заголовки запросов

OPTIONS /code/account HTTP/1.1 
Host: api.example.com 
Connection: keep-alive 
Access-Control-Request-Method: GET 
Origin: http://www.example.com 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 
Access-Control-Request-Headers: authorization 
Referer: http://www.example.com/account/payout 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,id;q=0.6,ms;q=0.4 
Accept: */* 

Я пробовал возможное решение от других, но у меня нет возможности исправить это. Всегда отображается 404 с вызовом метода OPTIONS, а не методом GET, как предполагалось.

+2

Код, который вы использовали совместно. 'Allow-methods' и' Allow-headers' находятся в заголовках ответов. 404 не генерируется из-за общего кода. – apokryfos

+0

Тонкая рамка по-прежнему воспринимает ее как метод «ОПЦИИ». И запрошенная конечная точка зарегистрирована методом 'GET'. проверьте этот ответ на консоли браузера 'ОПЦИИ http://api.example.com/code/account 404 (не найдено)'. И он продолжает показывать, что XMLHttpRequest не может загрузить http://api.example.com/code/account. Ответ на предполетный период имеет недопустимый код состояния HTTP 404' –

+1

Как я понимаю, это не запрос 'GET', это запрос' OPTIONS', после чего последует запрос 'GET', поэтому вам может потребоваться зарегистрировать оба. – apokryfos

ответ

0

После исследования и исследования я закончил использование промежуточного программного обеспечения CORS для Slim, как предложила @Mika Tuupola. Но так как я использую Slim v2, это репо https://github.com/palanik/CorsSlim подходит для меня. И если вы используете Slim v3, используйте этот репо https://github.com/tuupola/cors-middleware, созданный нашим спасителем. Надеюсь, поможет!

0

Для Слим Framework 2.4 версии, я сделал небольшой хак для решения предполетной OPTIONS просить

\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim(); 
    if($app->request->isOptions()) { 
     return true; 
     break; 
    } 
    $app->post('/authenticate', 'authenticateUser'); 

$app->run(); 

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

Моего файл .htaccess был похожа следующим

Header add Access-Control-Allow-Origin "*" 
Header add Access-Control-Allow-Headers "X-Requested-With, Content-Type, Accept, Origin, Authorization" 
Header add Access-Control-Allow-Methods "GET, POST, OPTIONS" 

Надеется, что это помогает.