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.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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.
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:
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.
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!!!