current_user - это ноль и user_signed_in? возвращение ложных реактивных рельсов с устройством - PullRequest
0 голосов
/ 03 мая 2020

У меня есть приложение rails 5.2, которое изначально было создано с Devise и простыми старыми erb файлами. Я мог бы проверить current_user во внешнем интерфейсе и все такое.

Теперь я пытаюсь медленно переместить его в интерфейс React. Я не изменил никаких настроек, но действие create моего контроллера возвращает false для user_signed_in?, но по индексу оно возвращает true. Есть ли в моем запросе заголовок, который я не передаю?

пример кода

class FanciesController < ApplicationController

  skip_before_action :verify_authenticity_token, only: :search_fancy
  after_action :verify_authorized

  def index
    @fancies = Fancy.all

    authorize @fancies

    respond_to do |format|
      format.html { render :index }
      format.json { render json: {...}, status: :ok }
    end
  end

  def create
    @fancy = Fancy.new(...)
    authorize @fancy

    respond_to do |format|
      if @fancy.save
        format.html { redirect_to @fancy, notice: 'Availability was successfully created.' }
        format.json { render :show, status: :created, json: {..}}
      else
        format.html { render :new }
        format.json { render json: {...}, status: :unprocessable_entity }
      end
    end
  end

end

Код внешнего интерфейса:

#index.html.erb

<%= react_component("FancyScreen", { selection_fancies: @fancies }) %>

компонент реагирования:

class FancyScreen extends React.Component {
  ...
    onCreateClick(selected_time) {
      const headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' };

      const requestOptions = {
        method: 'POST',
        headers: headers,
        body: JSON.stringify({...})
      }

      fetch(curl_url, requestOptions)
      .then(response => response.json())
      .then(data => {

        new_fancy.push(data)
        fn.setState({
          fancies: new_fancy
        });
      });
    }
  }
}

Я попытался передать токен csrf через мои заголовки, но это все равно не сработало.

‘X-CSRF-TOKEN’: $(‘meta[name=”csrf-token”]’).attr(‘content’)

Я определенно отсутствует, я скучаю по некоторым основам, но если бы кто-то мог указать мне правильное направление, я уверен, что мог бы понять это. Я попытался установить devise-jwt gem, но, похоже, это не совсем то, что я хочу.

Есть идеи, что я делаю не так?

1 Ответ

0 голосов
/ 07 мая 2020

IMO для аутентификации пользователя в интеграции React-Rails необходимо использовать систему аутентификации на основе токенов. Проверьте devise_token_auth драгоценный камень. После первого входа в рельсы вам отправят client-id, token-id и uid. Храните их в файлах cookie, и каждый раз, когда вы делаете вызов API, отправляйте их в заголовок. API обновит sh эти значения и отправит их обратно на фронт. Снова обновите куки с новыми значениями и включите go с этой процедурой.

...