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.
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!!!