403 forbidden on express. Can't accept Authorization header

Varuzh Ghazaryan picture Varuzh Ghazaryan · Jun 18, 2018 · Viewed 10.1k times · Source

I have a REST Api, and all endpoints must send a response when the user has an authentication token (I use the jwt token). everything works fine when I test my code using postman, but from front not working(session closes after OPTION request, and on the request header bearer token not set).

Authentication Middleware

module.exports = function(req, res, next) {
    const authorization = req.headers['authorization'];
    console.log(authorization);
    const token = authorization
      ? authorization.replace('Bearer ', '')
      : null;

    if (!token) 
      return res.status(403).send({ auth: false, message: 'No token provided.' });

    jwt.verify(token, config.secret, function(err, decoded) {      
      if (err) 
        return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' });    

      req.userId = decoded.id;
      next();
    });
}

route

const Router                = require('express').Router;

//Authentication Middleware
const requireAuthentication = require('../middlewares/').Auth()

module.exports = () => {
  let router = new Router();
  router.use(requireAuthentication);
  router.use('/accounts', require('./account')());
  router.use('/projects', require('./projects')());
  return router;
};

with authentication https://i.stack.imgur.com/cAFw5.png

without authentication https://i.stack.imgur.com/VUuuv.png

Answer

Varuzh Ghazaryan picture Varuzh Ghazaryan · Jun 18, 2018

The reason was in access headers

I add middleware in bootstrap file.

app.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');

    if ('OPTIONS' === req.method) {
      res.send(200);
    }
    else {
      next();
    }
});