Rails возвращает 401 Unauthorized for User Auth Flow — Rails, devise gem, Devise_token_auth gem

Я впервые пытаюсь связать мой интерфейс React Native с серверной частью API Rails. Для этого я работаю с потоком аутентификации пользователя, а точнее, с входом в систему (создание пользователя в базе данных с помощью User.create и модели пользователя).

Я настроил интерфейс для работы с Redux и отправил запрос на выборку, отправляя данные из формы в формате JSON на рельсы. Данные передаются в Rails без проблем.

Однако проблема, похоже, исходит из Rails, где я получаю 401 в консоли 401 Unauthorized с параметром, проходящим через Parameters: {"session"=>{}}. Почему это так и как я могу это исправить? Я пробовал кучу решений на SO, GitHub и некоторых независимых формах, и ничего не работает.

По сути, я хочу, чтобы React отправлял пользовательские данные, представленные в имени пользователя и пароле (пока что там все хорошо), Rails обрабатывал имя пользователя и пароль в контроллере переопределенных сеансов (похоже, он это делает) и вернуть статус «успех» и токен аутентификации пользователя, который мы можем сохранить в React Native.

SignInAction.js из React Native

export const emailChanged = (email) => {
  return {
    type: 'EMAIL_CHANGED',
    payload: email
  };
};

export const passwordChanged = (password) => {
  return {
    type: 'PASSWORD_CHANGED',
    payload: password
  };
};

export const loginUser = ({ email, password }) => {
  return (dispatch) => {
    dispatch({
      type: 'LOAD_SPINNER'
    });
    fetch('http://localhost:3000/api/v1/auth/sign_in/', {
        method: 'POST',
        headers: {
            //headers beyond log in user should contain the user authentication token to prove authentication
          Accept: 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          // user: {
            email,
            password,
          // }
        })
      }).then((response) => {
        console.log(response);
        //this line is a problem
        if (response.status === 401) {
          console.log('AUTHENTICATION ERROR!!');
          dispatch({
            type: 'LOGIN_FAILED'
          });
        } else {
          console.log('SUCCESS!!');
          response.json().then(data => {
            console.log(data);
            dispatch({
              type: 'LOGIN_USER_SUCCESS',
              payload: data
            });
          });
        }
      });
  };
};

Routes.rb из Rails

Rails.application.routes.draw do


  namespace :api do
   scope :v1 do
    mount_devise_token_auth_for 'User', at: 'auth', controllers: {
        registrations: 'api/v1/overrides/registrations',
        sessions: 'api/v1/overrides/sessions'
        }
    end
  end
end

/api/v1/overrides/sessions_controller.rb из Rails

module Api::V1::Overrides
 class SessionsController < DeviseTokenAuth::SessionsController
     # Prevent session parameter from being passed
        # Unpermitted parameter: session
        wrap_parameters format: []
 end
end

person James Stirrat    schedule 19.05.2020    source источник


Ответы (1)


Была та же проблема, никогда не мог заставить ее работать с выборкой, я предполагаю, что отправлен неправильный заголовок, который невозможно отследить.

Я переключаюсь на axios (yarn add axios), а затем:

axios.post("http://localhost:3000/users/sign_in", {
      user: {
        email: "[email protected]",
        password: "123123",
      },
});

Задача решена

person Emmanuel Orozco    schedule 19.12.2020