我已经设置了一个包含身份验证的MERN应用。为了进行身份验证,我使用了Passort和Google Oauth20。身份验证已设置并且有效,并且可以使用它基于用户是否登录来保护应用程序客户端上的组件的安全。但是,当我尝试“发布”时,可以从服务器“获取”数据“从客户端到服务器数据库后端的数据,我收到一条错误消息,提示我必须登录。
基于测试,我确定前端正在发送数据。当数据到达服务器端时,会发生此问题。基于我设置的中间件,它返回错误“您需要登录”。我正在使用axios.js发布数据,而我的reactjs应用程序正在使用redux。
这是我的动作创作者:
export const fetchUser = () => async dispatch => {
const res = await axios.get('/api/current_user');
dispatch({type: FETCH_USER, payload: res.data});}
export const postRecipeUri = (values) => async dispatch => {
let res;
try {
res = await axios.post("http://localhost:5000/api/recipes", values);
} catch (err) { console.log("An error occurred trying to Post")}
try { dispatch({ type: POST_RECIPE_URI, payload: res.data });
} catch (err) { console.log("An Error occurred while trying to dispatch POST_RECIPE_URI")}}
这是我的路线:
app.get(
'/api/recipes', requireLogin, (req, res) => {
console.log("googleId in 'get': " + req.user.googleId);
User.findOne({googleId: req.user.googleId})
.then(doc => {
res.send(doc);
})
.catch(err => {
console.error("There is an error here")
});
});
app.post("/api/recipes", requireLogin, (req, res) => {
console.log("I am in the /api/recipes route: " + req.body.cheeseUrl);
User.findOne({ googleId: req.user.googleId })
.then(doc => { ...
两条路线均已通过Postman进行了测试,并且可以正常工作。当我在浏览器中放置“ get” URL时,我也可以看到我的数据库数据。对于app.post,错误发生在我的应用程序中的“ req.user.googleId”。这是在将“ requireLogin”中间件放入该方法之前来自morgan的反馈:
添加“ requireLogin”中间件后,出现以下错误,该错误使我知道用户未登录:
我正在使用有效的标准Passport Google Oauth设置。我可以登录Google并获取凭据,然后通过Mongoose将其存储在MongoDB中。
我认为这是我的客户端和服务器之间的cors问题,但是我对cors的工作原理没有深入的了解。我也在想,也许我需要在客户端中放置一个令牌,但是我还无法完全理解如何设置令牌。对于如何解决此问题的任何建议或意见将不胜感激。