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