Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Login sempre passa por /* e não pelo /autenticar

Olá professor, não sei qual foi meu erro, mas quando faço o post para /autenticar, sempre passa na função verificaToken, já tentei de tudo mas não sei mais o que fazer.

Meu código do arquivo express.js

var express = require('express');
var consign = require('consign');
var bodyParser = require('body-parser');

module.exports = () => {
  var app = express();

  app.use(bodyParser.json());
  app.set('secret', 'q!w@e#r$t%y');

  consign()
    .include('models')
    .then('api')
    .then('controllers/auth.js')
    .then('controllers')
    .into(app);

  return app;
}

Meu código do controllers/auth.js

module.exports = function(app) {

  var api = app.api.auth;
  app.post('/autenticar', api.autentica);
  app.use('/*', api.verificaToken);
};

Meu código da api/auth.js

var mongoose = require('mongoose');
var jwt  = require('jsonwebtoken'); 

module.exports = function(app) {

     var api = {};
     var model = mongoose.model('Usuario');

     api.autentica = function(req, res) {
      console.log('Autenticando usuário');
      let login = req.body.login;
      let password = req.body.password;
      model.findOne({login, password}).then((user) => {
        if(!user) {
          console.log('Login e senha inválidos');
          res.sendStatus(401); 
        }
        else {
          let token = jwt.sign({ login: user.login }, app.get('secret'), {expiresIn: 7200});
          console.log('Token criado e sendo enviado no header da resposta');
          res.set('x-access-token', token);
          res.end();
        }
      }, (error) => {
        console.log('Login e senha inválidos');
        res.sendStatus(401);
      });
     };

    api.verificaToken = function(req, res, next) {
        let token = req.headers['x-access-token'];
        if(token) {
          console.log('verificando token...');
          jwt.verify(token, app.get('secret'), (error, decoded) => {
            if(error) {
              console.log('Token rejeitado');
              res.sendStatus(401);
            }
            req.usuario = decoded;
            next();
          });
        }
        else {
          console.log('Token não foi enviado');
          res.sendStatus(401);
        }
    }

    return api;
};
2 respostas
solução!

Descobri o problema, era erro de cors, mas não aparecia mensagem nenhuma nem no navegador nem no terminal, eu tive que fazer:

npm install cors --save

E no express.js

var express = require('express');
var consign = require('consign');
var bodyParser = require('body-parser');
var cors = require('cors');

module.exports = () => {
  var app = express();

  app.use(cors());
  app.options('*', cors());

  app.use(bodyParser.json());
  app.set('secret', 'q!w@e#r$t%y');

  consign()
    .include('models')
    .then('api')
    .then('controllers/auth.js')
    .then('controllers')
    .into(app);

  return app;
}

Boa noite, Fernando! Como vai?

Que bom que conseguiu resolver o seu problema! E obrigado por compartilhar a sua solução conosco! Assim todos crescemos juntos e fazemos da Alura uma plataforma cada vez melhor! Continue assim!

Grande abraço e bons estudos, meu aluno!