Problemas ao fazer consultas em API java rest com Angular
22 respostas
springjavaangular
A
Alexsandro_Andrade
estou tentando implementar uma api usando spring boot e spring security, consegui fazer a autenticação de acesso co login e senha, no entanto, apos conseguir acesso não consigo fazer a busca por dados no banco, o navegador alega acesso negado, alguém poderia me ajudar com esse problema??
boa noite Lucas! sim, o angular esta recebendo o token normalmente, o login esta ocorrendo normalmente
L
Lucas_Camara1 like
Blz, mas ao consultar, o token também está sendo enviado na requisição GET (header Authorization)?
A
Alexsandro_Andrade
bom dia Lucas! eu acabei observando que na minha classe
br.com.alexdeveloper.springrestapi.security.JWTTokenAutenticacaoService
dentro do método de pegar a autenticação, getAuthentication o token esta vindo nulo, na hora que faço a minha consulta depois de ter logado, não consegui entender o porque disso esta ocorrendo, consegue me ajudar?
Como vc está enviando o token pelo frontend? (copie e cole o código, evite mandar a imagem do código)
A
Alexsandro_Andrade
Lucas, como eu ainda estou estudando sobre o assunto, acabo tendo alguns problemas no entendimento. mas acredito que faço esse envio no método addAuthentication. dentro da classe JWTTokenAutenticacaoService
@Service @Component
public class JWTTokenAutenticacaoService {
// Senha única para compor a autenticação e ajudar na segurançaprivatestaticfinalStringSECRET="SenhaExtremamenteSecreta";// Prefixo padrão de TokenprivatestaticfinalStringTOKEN_PREFIX="Bearer";privatestaticfinalStringHEADER_STRING="Authorization";// Gerando token de autenticação e adicionando ao cabeçalho e resposta Http/*Gerando token de autenticado e adiconando ao cabeçalho e resposta Http*/publicvoidaddAuthentication(HttpServletResponseresponse,Stringusername)throwsIOException{liberacaoCors(response);/*Montagem do Token*/StringJWT=Jwts.builder()/*Chama o gerador de Token*/.setSubject(username)/*Adicona o usuario*/.signWith(SignatureAlgorithm.HS512,SECRET).compact();/*Compactação e algoritmos de geração de senha*//*Junta token com o prefixo*/Stringtoken=JWT;/*Bearer 87878we8we787w8e78w78e78w7e87w*//*Adiciona no cabeçalho http*/response.addHeader(HEADER_STRING,token);/*Authorization: Bearer 87878we8we787w8e78w78e78w7e87w*//*Liberando resposta para porta diferente do projeto Angular*//*Escreve token como responsta no corpo http*/response.getWriter().write("{\"Authorization\": \""+token+"\"}");}// Retorna o usuário validado com token ou caso não seja válido retorna nullpublicAuthenticationgetAuthentication(HttpServletRequestrequest,HttpServletResponseresponse){liberacaoCors(response);// Pega o token enviado no cabeçalho HttpStringtoken=request.getHeader(HEADER_STRING);if(token!=null){// Faz validação do Token do usuário na requisiçãoStringuser=Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody().getSubject();if(user!=null){Usuariousuario=ApplicationContextLoad.getApplicationContext().getBean(UsuarioRepository.class).findUserByLogin(user);if(usuario!=null){returnnewUsernamePasswordAuthenticationToken(usuario.getLogin(),usuario.getSenha(),usuario.getAuthorities());}}}returnnull;}privatevoidliberacaoCors(HttpServletResponseresponse){if(response.getHeader("Access-Control-Allow-Origin")==null){response.addHeader("Access-Control-Allow-Origin","*");}if(response.getHeader("Access-Control-Allow-Headers")==null){response.addHeader("Access-Control-Allow-Headers","*");}if(response.getHeader("Access-Control-Request-Headers")==null){response.addHeader("Access-Control-Request-Headers","*");}}
}
L
Lucas_Camara1 like
Veja bem. Ao autenticar, quando o token for gerado, ele deve ser enviado ao cliente (frontend). Com o token em mãos, o frontend deve armazená-lo em um cookie ou localstorage do navegador, para que, em novas requisições, o frontend envie esse token utilizando o header Authorization.
A
Alexsandro_Andrade
entendi Lucas! nesse momento eu estou recebendo essa autenticação no meu front, pois com ela é possivel eu fazer o login, nesse trecho do código ocorre exatamente o que vc esta dizendo, coloquei um debugger no codigo do front e abri o console pra vc ver como estou conseguindo capturar a autenticação, a questao e que depois de conseguir logar eu nao consigo buscar uma lista de dados no meu banco, pois ele continua alegando erro de autenticação.
armazenando o token no storage no front
login(usuario){
console.info(JSON.stringify(usuario));returnthis.http.post(AppConstants.baseLogin,JSON.stringify(usuario)).subscribe(data=>{debugger;vartoken=JSON.parse(JSON.stringify(data)).Authorization;localStorage.setItem("token",token);console.log("token "+localStorage.getItem("token"));this.router.navigate(['home']);},error=>{console.error("Erro ao fazer login");alert("Acesso negado");});
Após o login, a rota é enviada para home. O componente dessa rota faz alguma requisição http? Se sim, como que vc está enviado o token nessa requisição?
@Injectable({providedIn:'root'})exportclassLoginServiceService{constructor(privatehttp:HttpClient,privaterouter:Router){}login(usuario){console.info(JSON.stringify(usuario));returnthis.http.post(AppConstants.baseLogin,JSON.stringify(usuario)).subscribe(data=>{debugger;vartoken=JSON.parse(JSON.stringify(data)).Authorization;localStorage.setItem("token",token);console.log("token "+localStorage.getItem("token"));this.router.navigate(['home']);},error=>{console.error("Erro ao fazer login");alert("Acesso negado");});}}
Coloque um debugger nele para ver se ele está sendo chamado. Para checar se não eh problema no backend, tente fazer a requisição pelo postman (ou qualquer outro) passando o token.
A
Alexsandro_Andrade
coloquei, em nenhum momento o interceptor esta sendo chamado. no postman os dados chegam corretamente
O HttpInterceptorModule foi adicionado ao módulo principal app.module ? Vc também pode tentar adicionar o interceptor diretamente no app.module para testar.
A
Alexsandro_Andrade
@Lucas_Camara, o HttpInterceptorModule não estava adicionado do app.module acabei de fazer isso e obtive outro erro, nao consegui entender do que se trata.
O estranho eh que o HttpClientModule está importado no app.module. Isso deveria funcionar. Como está o seu HttpClientModule?
A
Alexsandro_Andrade
como assim? você se refere ao Service??? não entedi sua pergunta
depois que adicionei o intercept no providers o o acesso esta dando negado
L
Lucas_Camara
O teste que pensei era de vc configurar o http interceptor diretamente no AppModule em vez de configurar num módulo intermediário HttpClientModule, mas apenas em função de teste para investigar pq o interceptor não está sendo chamado.
Porém, mesmo usando o módulo HttpClientModule, deveria funcionar.
A
Alexsandro_Andrade
OK, eu disponibilizei o projeto no bittbucket, se possível clona ele na sua maquina e da uma olhada, agradeço muito.