我已设置护照以使用Google策略,并且可以直接指向/ auth / google。我目前拥有它,以便当您使用google身份验证oauth2登录时,我的端点将通过检查req.user
进行身份验证。当我在浏览器中访问端点时,这就有效。如果我转到/auth/google
然后转到/questions
,我就可以提出请求。但是,当我尝试从redux发出获取请求时,我会收到一条错误消息Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0
。它出现是因为fetch API尝试访问我的/questions
端点,通过我的loggedIn
中间件,然后没有遇到if (!req.user)
并重新定向。有关如何使用PassportJS和passport-google-oauth2从Fetch API进行身份验证的任何想法?
loggedIn
功能:
function loggedIn(req, res, next) {
if (req.user) {
next();
} else {
res.redirect('/');
}
}
以下是我的GET&#39;端点。
router.get('/', loggedIn, (req, res) => {
const userId = req.user._id;
User.findById(userId, (err, user) => {
if (err) {
return res.status(400).json(err);
}
Question.findById(user.questions[0].questionId, (err, question) => {
if (err) {
return res.status(400).json(err);
}
const resQuestion = {
_id: question._id,
question: question.question,
mValue: user.questions[0].mValue,
score: user.score,
};
return res.status(200).json(resQuestion);
});
});
});
redux获取请求:
function fetchQuestion() {
return (dispatch) => {
let url = 'http://localhost:8080/questions';
return fetch(url).then((response) => {
if (response.status < 200 || response.status >= 300) {
let error = new Error(response.statusText);
error.response = response;
throw error;
}
return response.json();
}).then((questions) => {
return dispatch(fetchQuestionsSuccess(questions));
}).catch((error) => {
return dispatch(fetchQuestionsError(error));
}
};
}
答案 0 :(得分:5)
Fetch API默认不发送Cookie,Passport需要确认会话。尝试将credentials
标记添加到您的所有提取请求中,如下所示:
fetch(url, { credentials: 'include' }).then...
或者如果您没有做CORS请求:
fetch(url, { credentials: 'same-origin' }).then...