Не работает функция выхода из системы React-Native to Ruby on Rails? Я не могу удалить сеанс - PullRequest
0 голосов
/ 27 мая 2020

У меня проблемы с моими действиями аутентификации из react-native в мой ruby on rails backend api. Я думал, что мои действия по регистрации / входу работают нормально, пока я не выполнил свое действие по выходу из системы и не начал получать ошибку контроллера rails. Моя функция выхода из системы запрашивает удаление сеанса пользователя и не может его найти, но мои функции входа / регистрации не имеют проблем с созданием сеанса.

Мои сеансы # Контроллер:

class SessionsController < ApplicationController
  def create
  @user = User.find_by_credentials(
    params[:user][:username],
    params[:user][:password]
  )

  if @user
    login(@user)
    render "users/show.json.jbuilder"
  else
    render json: ["Invalid username/password combination"], status: 401
  end
end

def destroy
  @user = current_user   # I believe the problem is here, as it can't find current_user see 
                         # application controller below
  if @user
    logout
    render json: {}
  else
    render json: ["Nobody signed in"], status: 404
  end
end
end

Контроллер приложения №, где я нахожу текущего пользователя на основе session_token

class ApplicationController < ActionController::Base
  skip_before_action :verify_authenticity_token

  helper_method :current_user, :logged_in?, :logout

  # private

  def current_user
    return nil unless session[:session_token]
    @current_user ||= User.find_by(session_token: session[:session_token])
  end

  def logged_in?
    !!current_user
  end

  def login(user)
    user.reset_session_token!
    session[:session_token] = user.session_token
    @current_user = user
  end

  def logout
    current_user.reset_session_token!
    session[:session_token] = nil
    @current_user = nil
  end
end

Мое действие выхода:

export const testLogout = () => dispatch => {
  dispatch(loadSpinner());
  axios({
    method: 'delete',
    url: 'http://10.0.2.2:3000/session',
  })
  .then((response) => {
    console.log("response: ", response);
    if(reponse.status === 200) {
      {dispatch(logoutCurrentUser(response))}
    } else {
      console.log("status", response.status);
    };
  });
};

Мои маршруты:

Rails.application.routes.draw do
  resources :users, only: [:create, :show]
  resource :session, only: [:create, :destroy, :show]
end

Ошибки (1): Начат УДАЛЕНИЕ "/ сеанс" для 127.0.0.1 в 2020-05-27 10:23:23 -0700 Обработка SessionsController # уничтожить как HTML Завершено 404 Не найдено за 0 мс (Просмотры: 0,2 мс | ActiveRecord: 0,0 мс).

(2): Возможное отклонение необработанного обещания (id: 0): Ошибка: запрос завершился неудачно с кодом состояния 404

Ошибка 2 из функции testLogout () даже не делает этого на .then (ответ) в функции.

Теперь эта ошибка 404 - моя собственная из метода #destroy в моем sessions_controller, и я немного не уверен, как получить здесь ошибку лучше, чем я чтение онлайн - это то, что react-native обрабатывает брови er cookie по-разному, и я обеспокоен тем, что концептуально что-то упускаю, но я очень не уверен, что это такое. Я знаю, что могу использовать AsyncStorage для сохранения сеансов, но как это влияет на внутреннюю проверку подлинности рельсов? Любая помощь в выяснении того, как выйти из системы, приветствуется, спасибо!

1 Ответ

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

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

Это кажется довольно достойным руководством, если вы используете devise: https://medium.com/@eth3rnit3 / crud-react -native-ror-backend-with-devise-auth-token-4407cac3aa0b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...