0

React Native フロントエンドを Rails API バックエンドにリンクすることに初めて挑戦しました。これを行うために、ユーザー認証フロー、より具体的にはサインイン (User.create と User モデルを介してデータベースにユーザーを作成する) を使用しています。

Redux と連携するようにフロント エンドをセットアップし、フェッチ リクエストを送信して、データをフォームから 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

同じ問題があり、フェッチで機能させることができませんでした。追跡できない間違ったヘッダーが送信されていると思います。

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 に答える