2016-03-17 7 views
0

настоящее время я использую метод CORS (переписывания мои внешние запросы от example.com/api?param=args к example.com/api/public/api.php?param=args) и отправки GET запрос следующим образом:CORS - аутентификация API: сеансы (CSRF Security) - работайте?

$.get('http://www.example.com/api'), { param: "args" }) 
    .done(function (data) { 
     alert(data); 
    }); 

Это работает абсолютно нормально, и я теперь могу междоменному обращение с запросами и ответами к моему программному обеспечению API.

Теперь я задаюсь вопросом, я настроил тестовый запрос, чтобы попытаться достичь Session.

session_start(); 
if(isset($_GET['store'])): 
    $_SESSION['key'] = $_GET['store']; 
elseif(isset($_GET['show'])): 
    echo $_SESSION['key']; 
endif; 

Когда я иду по ссылке непосредственно в браузере, это, однако, отлично работает, когда я посылаю запрос от внешнего домена, то второй запрос, кажется, «забыть» Session key я сохраненную.

Код:

$.get('http://www.example.com/api'), { store: "test" }) 
    .done(function() { 
     $.get('http://www.example.com/api'), { show: "args" }) 
      .done(function (data) { 
       alert(data); 
     }) 
    }); 

данные не определен

Есть ли способ, что я могу сделать сервер, который отправляет запросы на самом деле «сохранить» или «помнить» сессию на API-сервер или есть способ, которым я могу добиться этого, используя работу?

Обратите внимание, что API будет использоваться несколькими людьми - как плагин - и каждый key будет фактически добавлен после отправки параметра Register в качестве запроса с данными администратора этой учетной записи, поэтому мне нужна какая-то аутентификация для используя API и не может фактически думать о том, как не использовать сеанс или заставить его работать с использованием сеанса.

Обратите внимание, что если я использую сеанс (как вы можете видеть это), он создает CRSF attack. Есть ли работа вокруг этого также?

ответ

1

По умолчанию учетные данные (такие как файлы cookie) не отправляются на запросы с кросс-началом, потому что они trigger preflight requests.

jQuery documentation описывает, как включить учетные данные:

$.ajax({ 
    url: a_cross_domain_url, 
    xhrFields: { 
     withCredentials: true 
    } 
}); 

фактически не может придумать способ вокруг не используя сеанса

Передайте маркер аутентификации обратно в теле ответа. Прочтите его с помощью JS. Попросите JS включить его в каждый запрос.

Обратите внимание, что если я использую сеанс (как вы можете видеть это), он создает атаку CRSF. Есть ли работа вокруг этого также?

Не используйте источник * в заголовке Access-Control-Allow-Origin. Разрешить доверенным сайтам использовать ваш API.

+0

Я не отправляю файлы cookie в запрос, я отправляю данные в Параме, который затем API будет хранить сеанс для этого запроса на этом сервере. Если я попробую это в браузере - он отлично работает, однако второй запрос, который я отправляю, на самом деле «забыл» «СЕССИЯ». Но эта последняя часть об атаке CRSF, это потрясающе!Я могу это сделать – KDOT

+0

'Имейте JS включить его в каждый запрос.' <- отлично, спасибо! – KDOT

+0

@ KyleE4K - «Я на самом деле не отправляю файлы cookie в запрос» - Умм, как вы считаете, сеансы работают? – Quentin

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