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

Angular não acessa Token enviado por NodeJS

Olá,

Estou com um problema de Token entre o Angular 2 e o NodeJS.

A partir do Curso de MEAN, resolvi fazer um projeto, mas com Angular 2. E utilizei como base o tópico abaixo para implementar a solução de autenticação no client: https://cursos.alura.com.br/forum/topico-adicionando-token-em-toda-requisao-com-angular-2-solucao-27821

Porém, quando chamo minha rota de autenticação, o Node gera o token e responde pro client. No DevTools do Chrome eu consigo ver o Token no response. Mas no Angular, meu objeto headers é vazio.

      return this.http
                 .post(this.url, JSON.stringify(login), {headers : headers})
                 .map((res) => {  

                    let token = res.headers.get('x-access-token');
                    console.log('>>>>',res.headers); //OBJECT HEADERS COM MAP VAZIO

                    if (token) {
                        this._loggedIn.next(true);
                        localStorage.setItem('token', token);
                    }
                 });

Ao tentar obter o token, fica null.

Percebi que se eu der um build no meu Angular CLI para produção e colocar o dist gerado dentro do node, no diretório /public, o problema não ocorre e consigo me autenticar perfeitamente. O problema ocorre somente quando o Angular é uma ponta externa.

Tentei resolver o problema de CORS com o seguinte código no Express:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "http://localhost:4200");
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-XSRF-TOKEN, x-access-token, Authorization, Content-Type, Accept");
    next();
});

Mas não resolveu. Alguma ideia?

6 respostas

Oi Yuri, vi seu post mais cedo e fiquei pensando no que poderia ser. Ainda não sei a causa. Aliás, nem conferir ainda a solução apontada pelo aluno no post que você passou.

Vou deixar aberto aqui para ver se alguém consegue enxergar o problema. Até agora não consegui identificar com as informações que você passou.

Yuri, no seu código para lidar com CORS, tente

  res.header("Access-Control-Allow-Origin", "*");

Olá Flávio,

Obrigado pelo retorno.

Até agora não está funcionando. Já havia trocado para "*" como você citou.

Alguns pontos que acho relevante salientar:

No response da autentivação, além do Token no header, no body eu estou mandando os dados do usuário, para manter em sessão no sistema. Isso está funcionado. O conteúdo do body chega perfeitamente.

Percebi também que ao chamar a rota de autencitação, no DevTools percebi duas requisições, uma do tipo OPTIONS e outra do tipo POST. O token eu consigo ver no DevTools no response do POST.

Alguma outra informação pode ser relevante?

Obrigado

solução!

Acho que rolou uma confusão nos cabeçalhos do CORS. O Access-Control-Allow-Headers não é pra isso que a gente quer - autorizar a leitura de um header especifico.

Pra isso, é o Access-Control-Expose-Headers

Era isso mesmo, agora o Angular passou a ver os headers que o Node envia.

Valeu!!

Eu sabia que chamando o Sérgio ele descobriria o problema. Obrigado Sérgio!