Почему Devise перенаправляет мой запрос на вход? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть приложение React, которое отправляет запрос на вход в Devise через мой бэкэнд Rails. Когда я пытаюсь попасть в конечную точку входа в систему, похоже, что мой ответ содержит HTML, ошибка консоли:

Unexpected token < in JSON at position 0

Однако я не вижу ничего на вкладке сети. Он просто говорит: «Не удалось загрузить данные ответа».

Я подозреваю, что это вызвано тем, что метод каким-то образом вызывает перенаправление, как указано в консоли Rails:

Started POST "/users/sign_in" for ::1 at 2020-04-06 11:10:51 -0700
Processing by SessionsController#create as */*
  Parameters: {"user"=>{"email"=>"REDACTED", "password"=>"[FILTERED]"}, "session"=>{"user"=>{"email"=>"REDACTED", "password"=>"[FILTERED]"}}}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
Redirected to http://localhost:3000/
Filter chain halted as :require_no_authentication rendered or redirected
Completed 302 Found in 12ms (ActiveRecord: 3.5ms | Allocations: 9110)

Вот мой JS метод, который вызывает Devise API:

const token = document.querySelector('meta[name="csrf-token"]').content;
    fetch(url, {
      method: "POST",
      headers: {
        "X-CSRF-Token": token,
        "Content-Type": "application/json"
      },
      body: JSON.stringify(userInfo)
    })
      .then(response => {
        if (response.ok) {
          return response.json();
        }
        throw new Error("Network response was not ok.");
      })
      .catch(error => console.log(error.message));
  }

А вот мой session_controller.rb:

class SessionsController < Devise::SessionsController
  protect_from_forgery with: :null_session
  skip_before_filter :verify_authenticity_token, :only => :create
  # POST /v1/login
  def create
    @user = User.find_by_email(user_params[:email])
    return invalid_login_attempt unless @user

    if @user.valid_password?(user_params[:password])
      sign_in :user, @user
      render json: @user
    else
      invalid_login_attempt
    end
  end

  def is_admin
    if current_user.admin?
      render json: { response: "true" }
    else
      render json: { response: "false" }
    end
  end

  def destroy
    sign_out(@user)
    render :json=> {:success=>true}
  end


    private

    def invalid_login_attempt
      warden.custom_failure!
      render json: {error: 'invalid login attempt'}, status: :unprocessable_entity
    en

    def user_params
       params.require(:user).permit(:email, :password)
    end
  end
end

А вот мой route.rb:

Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: 'registrations', sessions: 'sessions' }

  devise_scope :user do
    get '/users/is_admin', to: 'sessions#is_admin'
  end

  root 'homepage#index'
  get '*path', to: 'homepage#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
...