Почему куки-файлы Rails 5.2 не доходят до браузера в среде разработки? - PullRequest
0 голосов
/ 02 марта 2020

Ваша помощь очень ценится и ценится. Заранее благодарим, если вы уделите немного времени чтению этой проблемы и в конечном итоге ответите.

Я работаю со стандартной системой аутентификации, хранящей user_id и запомнить_token в файлах cookie. При заполнении формы входа в систему для этого пользователя генерируется новый токен, который сохраняется в файлах cookie следующим образом:

# Remembers a user in a persistent session.
  def remember(user)
    user.remember      # Generates a remember token + digest and saves the digest on the user side
    cookies.signed.permanent[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

Я заметил проблему, когда после отправки формы с правильными данными для входа пользователь всегда сразу же был перенаправлен обратно на страницу входа.

Это потому, что user_id и Remember_token были равны нулю при достижении действия после сеанса # create. Они также не появились в консоли браузера (пробовал на Safari и Chrome с одинаковыми результатами). Я думал, что куки были потеряны во время перенаправления.

Но, играя дальше, я включил попытки записать куки непосредственно на обычном действии 'get' перед любым перенаправлением:

class SessionsController < ApplicationController

  def new
    cookies[:hello] = {value: 'store_me_please', expires: 10.years.from_now}
    cookies.permanent[:a_true_cookie] = true
    cookies.permanent.signed[:remember_me] = 123
    session[:hello] = 'store_me_in_session_please'

    if logged_in?
      redirect_to user_path(current_user)
    else
      render layout: "unauthenticated"
    end
  end
end

И заметил что хранилище cook ie в браузере всегда остается пустым при доступе к действию. Ничего не будет записано.

Я думал, что это может быть вызвано проблемой защиты csrf, поскольку rails может очистить сеанс, если он не может аутентифицировать свой токен. Поэтому я прокомментировал «protect_from_forgery» в application_controller, но не увидел никаких изменений.

Кажется, что secret_key_base находится в новом файле credentials.yml; хотя это первое приложение Rails 5.2, для которого я имею дело с такими проблемами, поэтому я мог что-то упустить в конфигурации.

Я также добавил следующую строку конфигурации в application.rb, который затем вызывает «ActionController»: : InvalidAuthenticityToken "исключение при отправке формы, несмотря на закомментированную строку" #protect_from_forgery with:: exception ".

config.session_store :cookie_store

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

1 Ответ

0 голосов
/ 02 марта 2020

Я не смог найти ни одного способа обойти эту проблему или найти точную причину. Моя интуиция направлена ​​на следующие возможные причины (только для целей документирования, в случае, если кто-то сталкивается с той же проблемой): - Проблема подписи Cook ie, вызванная поврежденной secret_key_base - Проблема CSRF / CORS, также вызванная поврежденной secret_key_base или вмешательством в подлинность токен, заставляющий рельсы отклонить куки перед отправкой ответа. - Некоторые параметры конфигурации не установлены должным образом, препятствуя нормальному выполнению.

Я потратил 3 дня на полный рабочий день, пытаясь диагностировать причину этого, и все же мне не повезло. Единственное решение, которое я мог придумать, - это перенести все файлы этого нефункционального приложения в копию функционального приложения с практически идентичной конфигурацией. Процесс занял час и решил проблему - но увы не дал причину.

...