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

Mudar o retorno do response no navegador

Estou tentando fazer um projeto angular + spring boot e preciso passar id,nome e email do usuario na resposta da autenticação, mas não estou conseguindo. O token estou passando pelo header.

6 respostas

Oi Leonardo,

Posta aqui como ficou seu código até então, que vamos tentar te ajudar a identificar o problema

package br.com.angularrest.angularrest.controller;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.angularrest.angularrest.model.LoginForm;
import br.com.angularrest.angularrest.security.TokenDto;
import br.com.angularrest.angularrest.security.TokenService;

@RestController
@RequestMapping("/auth")
public class AutenticacaoController {

    @Autowired
    private AuthenticationManager authmanager;

    @Autowired
    private TokenService tokenService;

    @PostMapping
    public ResponseEntity<TokenDto> autenticar(@RequestBody @Valid LoginForm form){
        UsernamePasswordAuthenticationToken dadosLogin = form.converter();
        try {
            Authentication authentication = authmanager.authenticate(dadosLogin);
            String token = tokenService.gerarToken(authentication);
            HttpHeaders headers = new HttpHeaders();
            headers.add("x-access-token", token);

            return new ResponseEntity<TokenDto>(new TokenDto(token, "Bearer"), headers, HttpStatus.OK);
        } catch (Exception e) {
            return ResponseEntity.badRequest().build();
        }

    }

}

Esse é o end-point que entrego no angular(segui os passos deste curso) e o angular estou seguindo este: https://cursos.alura.com.br/course/angular-boas-praticas-arquiteturas-formularios/task/86757, na parte de trocar de login para logout não esta funcionando, então abri esse topico: https://cursos.alura.com.br/forum/topico-header-nao-muda-228592

Depois de pesquisar muito e quebrar a cabeça tentei rodar o projeto angular que fiz com a api passada no curso do angular e funcionou tudo certo o Login/Logout como explico no tópico "header não muda", consegui falar com um colega da alura e ele me disse que talvez o problema seja por que eu passo o token no response e deveria ser o id,nome e email. Então eu gostaria de mudar o retorno do response, mas tentei de diversas maneira e não da certo.

Oi Leonardo,

Se eu entendi bem, você precisa no processo de autenticação devolver juntamente com o token mais algumas informações do usuário que se autenticou, correto?

Tem 2 formas de fazer isso:

  1. Adicionar essas informações dentro do próprio token(no curso foi mostrado como adicionar o id do ussário logado, mas é possível setar mais informações)
  2. Alterar o TokenDto para incluir as informações adicionais que você precisa devolver, além da String do token e da String do tipo de token.

Obrigado pela atenção e prontidão em me responder, consegui fazer o login/logout funcionar mudando o subject deixando o retorno do token assim: { "iss": "Cadastro", "sub": "Aluno", "iat": 1656555549, "exp": 1656641949 }

modificando essa parte do código:

        return Jwts.builder()
                .setIssuer("Cadastro")
                .setSubject(logado.getNome())
                .setIssuedAt(hoje)
                .setExpiration(dataExpiracao)
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();

Mas gostaria de passar o token dessa forma: { "iss": "Cadastro", "id": 1, "nome": "Aluno", "email":"aluno@email.com", "iat": 1656555549, "exp": 1656641949 }

Mas não consegui, caso seja possível uma dica de como faço para deixar o retorno do jeito desejado eu agradeço.

A dica numero 2 eu já havia tentado antes mas me enrolei muito e também não consegui.

solução!

Dentro do Token você pode fazer assim:

return Jwts.builder()
                .setIssuer("Cadastro")
                .setSubject(logado.getId())
                .setIssuedAt(hoje)
                .setExpiration(dataExpiracao)
                .claim("nome", logado.getNome())
                .claim("email", logado.getEmail())
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();

Dessa forma o id do usuário vai como subject no token e o email e nome vão como claims. Como isso você pode acessar esses dados contidos no token na sua app frontend.

Rodrigo muito obrigado pela ajuda e atenção, estava a dias tentando arrumar isso. Você é nota 10!!!