промежуточное ПО next () не работает с аутентификацией токена - PullRequest
0 голосов
/ 04 апреля 2020

Я делаю регистрацию учетной записи с использованием аутентификации электронной почты, отправляю токен по URL-адресу, затем использую useParams, чтобы получить токен из URL-адреса и передать его бэкэнду для окончательной проверки учетной записи пользователя.

Проблема заключается в том, что в промежуточном программном обеспечении аутентификации бэкэнда обратный вызов next () не продолжается в процессе.

Промежуточное программное обеспечение разрешает / декодирует токен успешно (потому что он показывает идентификатор пользователя, сохраненный внутри него), и когда вызывается next (), все останавливается, не выдает никаких ошибок, ничего. Это происходит, когда я делаю запрос GET, если я делаю запрос POST, он возвращает, что токен недействителен, что не соответствует действительности.

Внешний запрос:

const Confirmation = () => {
    const [popMessage, setPopMessage] = useState('');

    let params = useParams("/confirm/:token");
    const {token} = params;

    const confirmAcc = async () =>{
        try {
            const config = {
                headers:{
                    'x-auth-token': token,
                }
            }
            await axios.get('/api/auth/confirm/', config)
            .catch(err=>{
                console.error(err.response);
            })
            setPopMessage('Your account has been confirmed');
        //    setTimeout(() => { window.location.href = '/login';}, 3500);
        } catch (err) {
            console.log(err.response.data);
            return;
        }
    }

Назад Маршрутизатор:

router.get('/confirm/', auth, async (req, res) => {
    console.log('Im here!!')
    try {
        console.log('Im here too!!')
        const user = await User.findById(req.user.id).select('-password');
        console.log('user', user)
        await user.update({ confirmed: true });
        sendEmail(user.email, user.name, "welcome");
    } catch (err) {
      res.status(401).send('your email token is invalid');
      return;
    }
});

Промежуточное программное обеспечение 'auth':

module.exports = function(req, res, next) {
    const token = req.header('x-auth-token');
    if (!token) {
        return res.status(401).send('No token, authorization denied ');
    }
    try {
        const decoded = jwt.verify(token, config.get('jwtSecret'));
        console.log('decoded:', decoded)
        req.user = decoded.user;
        next();
    } catch(err) {
        res.status(401).send('Token is not valid');
    }
}

Самое странное: с этим маршрутизатором это происходит только в том случае, если остальная часть приложения работает с таким же точным кодом. Буду очень признателен, если кто-нибудь сможет поделиться какими-либо идеями.

Заранее спасибо!

1 Ответ

0 голосов
/ 08 апреля 2020

Проблема заключалась в типе запроса: я изменил запрос PUT и отправил пустое тело в запросе. Это исправлено, вот код:

const Confirmation = () => {
    const [popMessage, setPopMessage] = useState('');

    let params = useParams("/confirm/:token");
    const {token} = params;

    const confirmAcc = async () =>{
        try {
            const config = {
                headers:{
                    'x-auth-token': token,
                }
            }
           // here, empty body and PUT req.
            const body = null
            axios.put('/api/auth/confirm/',body, config)
            .catch(err=>{
                console.error(err.response);
            });
            setPopMessage('Your account has been confirmed');
            setTimeout(() => { window.location.href = '/login';}, 3500);
        } catch (err) {
            console.log(err.response.data);
            return;
        }
      };
...