Посылка cook ie в ответе XHR, но она не сохраняется? - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь передать HttpOnly cook ie с ответом от API, который я пишу. Цель состоит в том, чтобы повар ie действовал как токен refre sh с целью тихий refre sh для SPA в React.

В моем методе контроллера я У меня следующий код:

response.set_cookie(
  :foo,
  {
    value: 'testing',
    expires: 7.days.from_now,
    path: '/api/v1/auth',
    secure: true,
    httponly: true
  }
)

Я делаю запрос на публикацию этого действия с помощью команды fetch, например, так:

fetch("http://localhost:3001/api/v1/auth", {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    email: 'aaron@example.com',
    password: '123456',
  })
})

Не уверен, что это важно, но Мне интересно, если передача файлов cookie в ответе XHR не работает? Однако, похоже, что это работает, как вы можете видеть в моем ответе, я получаю следующее:

Set-Cookie: foo=testing; path=/api/v1/auth; expires=Sun, 26 Jan 2020 05:15:30 GMT; secure; HttpOnly

Также на вкладке Network в разделе Cookies Я получаю это: image Cookies tab">

Однако я НЕ получаю повара ie, установленного в Application -> Cookies: Cookies not showing up

Чтобы уточнить, приложение React сидит на localhost:3000, а бэкэнд рельсов слушает localhost:3001.

Есть идеи?

1 Ответ

1 голос
/ 21 января 2020

Хорошо, похоже, мне нужно было настроить мой CORS (в Rails это ваше Rack::CORS промежуточное ПО.

Я настроил свой config/initializers/cors.rb файл следующим образом:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'http://localhost:3000'
    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head],
      credentials: true
  end
end

и моя команда извлечения должна выглядеть примерно так с credentials: 'include' в качестве параметра:

return fetch(`${endPoint}`, {
    method: 'POST',
    credentials: 'include',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      email,
      password,
      password_confirmation: passwordConfirmation
    })
  })

Добавление credentials: true позволяет устанавливать куки в браузере. Очевидно, даже если вы отправляете их, вам нужно Access-Control-Allow-Credentials: true в заголовках для браузера, чтобы что-то с ними делать.

РЕДАКТИРОВАТЬ: Воссоздание этого приложения для обучения Я снова столкнулся с этой проблемой, даже после включения опции credentials. Я не видел, чтобы HttpOnly cook ie хранился в браузере. Однако оказалось, что он БЫЛ и действительно отправляется. Возможно, вы можете проверить это в действии контроллера. Имейте это в виду, если это решение не «Кажется» работает на вас!

...