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

Mesmo recebendo o token a aplicação não permite a listagem das fotos

Minha aplicação está recebendo o token tudo certinho, faz login e etc, mas quando o angular vai acessar a rota para listar as fotos do back-end a api.lista no arquivo api/foto.js entra no .then mas não realiza o res.json(fotos) . Alguém poderia me ajudar ?

- app/routes/auth.js

module.exports = function(app){
    api = app.api.auth;
    app.post('/autenticar', api.autenticar);
    app.use("/*", api.verificaToken);
}

- app/api/auth.js

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

module.exports = function(app){

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

    api.autenticar = function(req, res){
        model.findOne({
            login : req.body.login,
            senha : req.body.senha
        })
        .then(function(usuario){
            if(!usuario){
                console.log("Usuario e senha inválidos");
                res.sendStatus(401);
            }else{
                var token = jwt.sign( {login : usuario.login} , app.get("secret"),{
                    expiresIn : 86400 // valor em segundo, aqui temos um total de 24 horas
                });

                res.set('x-access-token', token); // adicionando token no cabeçalho de resposta
                res.end(); // enviando a resposta
                console.log("Autenticação adicionada a resposta");
            }
        });
    }

    api.verificaToken = function(req, res, next){
        var token = req.headers["x-access-token"]; // busca o token no header da requisição
        console.log("token " + token);
        if(token){
            console.log("Token recebido, decodificando");
            jwt.verify(token, app.get("secret"), function(err, decoded){
                if(err){
                    console.log("token rejeitado");
                    return res.sendStatus(401);
                }
                console.log("token aceito");

                // guardou o valor decodificado do token na requisição. No caso, o login do usuário.
                req.usuario = decoded;
                console.log("vai pra controller foto")
                next();  
            });
        }else{
            console.log("Token não enviado");
            return res.sendStatus(401);
        }
    }
    return api;
};

- app/api/foto.js

var mongoose = require("mongoose");

module.exports = function(app){
    var api = {};

    // solicitando o modelo 'Foto'
    var model = mongoose.model('Foto');

    api.lista = function(req, res){
        console.log("------------- chegou no controller next funcionou  -----------------");
        console.log(req.headers);
        model.find()
            .then(function(fotos){
                console.log("------------- enviando resposta  -----------------");
                res.json(fotos);
                console.log(res.json(fotos));
                console.log("------------- resposta enviada -----------------");
            }, function(error){
                console.log(error);
                res.sendStatus(500);
            });
    };

    api.buscaPorId = function(req, res){

        var id = req.params.id;

        model.findById(id)
            .then(function(foto){
                if (!foto) throw new Error('Foto não encontrada');
                res.json(foto);
            }, function(error){
                console.log(error);
                res.sendStatus(500);
            });
    };

    api.removePorId = function(req, res){
        var id = req.params.id;
        model.remove({_id : id})
            .then(function(foto){
                res.sendStatus(204);
            }, function(error){
                console.log(error);
                res.sendStatus(404);
            });
    };

    api.adiciona = function(req, res){
        var foto = req.body;

        model.create(req.body)
            .then(function(foto){
                res.json(foto);
            }, function(error){
                console.log(error);
                res.sendStatus(500);
            });
    }
    api.altera = function(req, res){
      model.findByIdAndUpdate(req.params.id, req.body)
        .then(function(foto){
            res.json(foto);
        }, function(error){
            console.log(error);
            res.sendStatus(500);
        });
    };
    return api;

Repositório: https://gitlab.com/cleber.carvalho/mean-stack

2 respostas
solução!

Quando nos autenticamos, recebemos o token e guardamos no navegador. Depois, a cada requisição, a aplicação precisa enviar o token sempre a qualquer requisição feita.

Talvez o problema esta no lado do Angular, ou na hora de guardar o token ou na hora de configurar seu interceptor que não deve estar enviando o token a cada requisição.

Para saber, basta você colocar alguns console.log() e verificar se no envio de requisições a função do interceptor responsável pelo envio do token esta fazendo isso corretamente.

Então, não basta verificar se o seu backend esta enviando o token na autenticação, tem que verificar se sua SPA esta enviando o token a cada requisição, caso contrário, não conseguirá acessar sua API.

Obrigado pela dica professor. Realmente o error era no interceptor, no if eu tinha colocado uma condição errada. Obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software