Конечные точки не проходят аутентификацию с помощью вызовов Fetch API (используя паспорт-google-oauth2)

У меня есть паспорт, настроенный для использования стратегии Google, и я могу направить на /auth/google great. В настоящее время у меня есть так, что когда вы входите в систему с использованием аутентификации Google oauth2, мои конечные точки будут аутентифицироваться, проверяя наличие req.user. Это работает, когда я просто добираюсь до конечных точек в своем браузере. Если я перейду к /auth/google, а затем к /questions, я смогу выполнить этот запрос на получение. Однако, когда я пытаюсь сделать запрос на выборку из избыточности, я получаю сообщение об ошибке, говорящее Uncaught (in promise) SyntaxError: Unexpected token < in JSON at position 0. Это происходит потому, что fetch API пытается добраться до моей конечной точки /questions, проходит через мое промежуточное ПО loggedIn, а затем не встречает if (!req.user) и вместо этого перенаправляется. Любые идеи о том, как пройти аутентификацию из Fetch API с помощью PassportJS и паспорта-google-oauth2?

Функция loggedIn:

function loggedIn(req, res, next) {
  if (req.user) {
    next();
  } else {
    res.redirect('/');
  }
}

Вот мой код для моей конечной точки GET.

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);
    });
  });
});

Запрос на избыточную выборку:

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));
    }  
  };
}

person Robby Kim    schedule 31.08.2016    source источник


Ответы (1)


Fetch API по умолчанию не отправляет файлы cookie, которые необходимы Passport для подтверждения сеанса. Попробуйте добавить флаг credentials ко ВСЕМ вашим запросам на выборку следующим образом:

fetch(url, { credentials: 'include' }).then...

или если вы не выполняете запросы CORS:

fetch(url, { credentials: 'same-origin' }).then...

person RhinoDavid    schedule 28.10.2016