Tuesday, 9 April 2019

JWT Login - No authorization token was found in middleware

I followed a tutorial to add login and registration to my Node.js app using JWT token and I'm having a hard time logging in and redirecting to my 'logged in' admin page. User registration works great, but the login portion I can't figure out.

This is the tutorial I was following: https://medium.freecodecamp.org/learn-how-to-handle-authentication-with-node-using-passport-js-4a56ed18e81e

My code for login looks like this:

router.post('/login', auth.optional, (req, res, next) => {
console.log(req.body);

var user = {
    email: req.body.email,
    password: req.body.password
}

if (!user.email) {
  return res.status(422).json({
    errors: {
      email: 'is required',
    },
  });
}

if (!user.password) {
  return res.status(422).json({
    errors: {
      password: 'is required',
    },
  });
}

return passport.authenticate('local', { session: false }, (err, passportUser, info) => {

    if (err) {
        return next(err);
    }

    if (passportUser) {
        const user = passportUser;
        user.token = passportUser.generateJWT();
        console.log("TOKEN: " + user.token);

        res.setHeader('Authorization', 'Token ' + user.token);

        return res.json({ user: user.toAuthJSON() });
    }

    return res.status(400).json({
        errors: {
            message: info,
        },
    });

    })(req, res, next);
});

My '/admin' "logged in" route looks like this:

router.get("/admin", auth.required, function(req, res) {
    res.render('admin', {
        user : req.user // get the user out of session and pass to template
    });
});

I'm not sure how I can redirect to my '/admin' route while also passing the token because currently I am seeing the following error after logging in. Makes sense since I am not passing the token to the '/admin' route...but how do I do that? :)

UnauthorizedError: No authorization token was found at middleware

Thanks in advance for the help!

EDIT:

Still can't figure this out and don't really understand how this flow is supposed to work...where do the headers need to be set to the token and how do I redirect to my admin page once the login is successful.

Here is my middleware code if this helps:

const getTokenFromHeaders = (req) => {

    console.log("REQ: " + JSON.stringify(req.headers));

    const { headers: { authorization } } = req;

    if(authorization && authorization.split(' ')[0] === 'Token') {
        return authorization.split(' ')[1];
    }

    return null;
};

const auth = {
    required: jwt({
        secret: 'secret',
        userProperty: 'payload',
        getToken: getTokenFromHeaders,
    }),

    optional: jwt({
        secret: 'secret',
        userProperty: 'payload',
        getToken: getTokenFromHeaders,
        credentialsRequired: false,
    }),
};



from JWT Login - No authorization token was found in middleware

No comments:

Post a Comment