0

我第一次尝试将我的 React Native 前端连接到我的 Rails API 后端。为此,我正在使用用户身份验证流程,更具体地说,是登录(通过 User.create 和 User 模型在数据库上创建用户)。

我已经设置了前端来使用 Redux 并发送一个 fetch 请求,将表单中的数据作为 JSON 发布到 rails。数据毫无问题地进入 Rails。

但是,问题似乎来自 Rails,我在控制台中得到一个 401,401 Unauthorized参数通过Parameters: {"session"=>{}}. 为什么会这样,我该如何解决?我在 SO、GitHub 和一些独立的表单上尝试了一堆解决方案,但没有任何效果。

本质上,我想要的操作是让 React 发送在用户名和密码中提交的用户数据(到目前为止似乎一切都很好),Rails 在覆盖的会话控制器中处理用户名和密码(它似乎正在这样做)并返回一个“成功”状态和用户身份验证令牌,我们可以将其存储在本机反应中。

React Native的SignInAction.js

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
            });
          });
        }
      });
  };
};

Rails中的Routes.rb

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

Rails中的/api/v1/overrides/sessions_controller.rb

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

1 回答 1

0

有同样的问题,永远无法让它与 fetch 一起工作,我认为发送了一些错误的标头,无法跟踪。

我切换到 axios ( yarn add axios) 然后:

axios.post("http://localhost:3000/users/sign_in", {
      user: {
        email: "1@test.com",
        password: "123123",
      },
});

问题解决了

于 2020-12-19T23:45:43.687 回答