2

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

ответ

4

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

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

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

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

Смежные вопросы