我第一次尝试将我的 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