реагировать / rails: пользователь не остается в системе при развертывании на сервере (netlify / heroku), но работает на localhost - PullRequest
0 голосов
/ 10 января 2020

Я использую ответный (ax ios) передний конец с рельсовым интерфейсом API. На локальном хосте (rails server / npm start) я остаюсь в системе и могу обновить sh страницу, оставаясь вошедшим в систему, но при развертывании для netlify / heroku обновление страницы приводит к выходу из системы.

Развернуто на: https://nicktohzyu-tdlv5-front.netlify.com/
https://nicktohzyu-tdlv5-api.herokuapp.com/ (API)

Код входа (реагировать):

handleSubmit(event) {
    const { email, password } = this.state;
    //console.log(this.props.api_url);
    axios
      .post(
        this.props.api_url+"/sessions",
        {
          user: {
            email: email,
            password: password
          }
        },
        { withCredentials: true }
      )
      .then(response => {
        if (response.data.logged_in) {
          this.props.handleSuccessfulAuth(response.data);
        } else{
          this.setState({
            loginErrors: response.data.errorMessage
          });
          //console.log("login error, " + response.data.errorMessage);
        }
      })
      .catch(error => {
        console.log("login error", error);
      });
    event.preventDefault();
  }


  handleSuccessfulAuth(data) {
    this.props.handleLogin(data);
    this.props.history.push("/dashboard");
  }


  handleLogin(data) {
    this.setState({
      loggedInStatus: "LOGGED_IN",
      user: data.user
    });
  }

Проверьте, вошел ли пользователь в систему:

//(in constructor)
    this.state = {
      loggedInStatus: "checking",
      user: {},
      api_url:api_url,
    };


  componentDidMount() {
    this.checkLoginStatus();
  }

  checkLoginStatus() {
    axios
      .get(this.state.api_url + "/logged_in", { withCredentials: true })
      .then(response => {
        if (
          response.data.logged_in
        ) {
          this.setState({
            loggedInStatus: "LOGGED_IN",
            user: response.data.user
          });
        } else if (
          !response.data.logged_in
        ) {
          this.setState({
            loggedInStatus: "NOT_LOGGED_IN",
            user: {}
          });
        }
      })
      .catch(error => {
        console.log("check login error", error);
      });
  }

Backend (рельсы с bcrypt): контроллер сессий:

class SessionsController < ApplicationController
  include CurrentUserConcern

  def create
    user = User
            .find_by(email: params["user"]["email"])
            .try(:authenticate, params["user"]["password"])

    if user
      session[:user_id] = user.id
      render json: {
        status: :created,
        logged_in: true,
        user: user
      }
    else
      render json: { 
        status: 401, 
        errorMessage: "Email or password incorrect"
      }
    end
  end

  def logged_in
    if @current_user
      render json: {
        logged_in: true,
        user: @current_user
      }
    else
      render json: {
        logged_in: false
      }
    end
  end

  def logout
    reset_session
    render json: { status: 200, logged_out: true }
  end
end

текущая проблема пользователя

module CurrentUserConcern
  extend ActiveSupport::Concern

  included do
    before_action :set_current_user
  end

  def set_current_user
    if session[:user_id]
      @current_user = User.find(session[:user_id])
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...