Как настроить CodeIgniter и Ion Auth с внешним и внутренним интерфейсами в разных доменах - PullRequest
0 голосов
/ 14 ноября 2018

Я работаю над модернизацией старого приложения CodeIgniter.Разделяя приложение на передний и задний края.

Новый внешний интерфейс представляет собой угловое приложение SPA.Бэкэнд все еще использует приложение CI.CI использует Ion_Auth для авторизации пользователей.

Все работает нормально, если оба находятся в одном домене, например localhost

Проблема в том, что каждая часть должна быть на разных URLдомены , т.е. .:

  • Frontend - localhost: 8081, в будущем будет example.com
  • Backend - localhost: 8082, в будущем будет API.example.com

Таким образом, Ion Auth может войти в систему пользователей, но когда я запрашиваю, вошел ли пользователь в систему, он возвращает false.CI doesent больше сохраняет сеанс.

Я также заметил, что когда оба находятся в одном домене , папка session содержит только один файл, что означает, что CI распознает сеанс.

Когда я устанавливаю на разные домены , папка session создает новый файл для каждого запроса XHR.Это означает, что КИ больше не держит сессию.

Почему это происходит?Что я должен сделать, чтобы фронт и бэкэнд работали должным образом с Ion Auth?

Вот моя конфигурация CI:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = BASEPATH . 'var/session/';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

$config['csrf_protection'] = FALSE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

Я также установил:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");

И вот как я делаю XHR-запросы.

$http({
  url: $rootScope.API_URL + "/user/check",
  method: "POST",
  headers: { "Content-Type": undefined },
  data: { /*...*/ }
}).then( /*...*/ )

1 Ответ

0 голосов
/ 16 ноября 2018

Я только что нашел в https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#section_5

Наиболее интересная возможность, предоставляемая как XMLHttpRequest или Fetch , так и CORS, - это возможность делать «проверенные» запросы, которые осведомлены о HTTP cookie и информация HTTP-аутентификации. По умолчанию в межсайтовых вызовах XMLHttpRequest "или Fetch браузеры не отправляют учетные данные. Для объекта XMLHttpRequest" или * необходимо установить специальный флаг 1018 * конструктор, когда он вызывается.

(Специальное выделение для ключевого слова NOT в предложении).

Я другими словами. Это все равно не сработает. В запросе XHR должен присутствовать специальный флаг. При использовании объекта AngularJS $hhtp я должен использовать withCredentials: true

$http({
  url: ...
  withCredentials: true
})

Также необходимо установить оба заголовка в ответах API:

Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost

К сожалению, я не смог использовать * как Access-Control-Allow-Origin, вместо этого я должен использовать правильные домены.

Заголовок «Access-Control-Allow-Origin» в ответе не должен быть подстановочным знаком «*», если режим учетных данных запроса «include».

Таким образом, я смог сделать XHR-запросы Cross origin с сохранением файлов cookie.

...