Я впервые пытаюсь связать мой интерфейс 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