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

erro Encoded password does not look like BCrypt

Boa noite, estou com um pequeno probleminha para realizar a autenticação do meu projeto, quando envio o json para /auth, aparece este erro Encoded password does not look like BCrypt, pesquisei em alguns forúns e o pessoal relatava que era referente ao tamanho do campo no banco de dados ( estou usando MYsql), apaguei e criei novamente minhas tabelas de usuario e perfil, adicionei a anotação @Length(min = 3, max = 240), mas eu tenho a impressão que o problema não é isto... Realizando alguns testes para printar algumas mensagens na tela, consegui constatar alguns detalhes, a consulta no banco está correta, os dados enviados pelo formularioDTO tbm estão chegando corretamente, o problema ocorre neste trecho de código:

@PostMapping public ResponseEntity<?> autenticar(@RequestBody @Valid LoginForm form) {

    UsernamePasswordAuthenticationToken dadosLogin = form.converter();

    try {

        Authentication authentication = authManager.authenticate(dadosLogin); // problema ococrre nesta linha

        String token = tokenService.gerarToken(authentication);

        return ResponseEntity.ok(new TokenDto(token, "Bearer"));
    } catch (AuthenticationException e) {

         return ResponseEntity.badRequest().build();
    }
}

Para ser mais exato, coloquei alguns system.outs e o antes do Authentication authentication = authManager.authenticate(dadosLogin); printa normal, porém, o system.out depois que declaro Authentication já não printa, nem chega a fazer a chamada do metodo gerarToken, o que pode estar ocorrendo? A senha do banco não está batendo? Fiz como foi explicado na aula para cria-la, criei o BCryptPasswordEncoder.encode("senha") e salvei o hash gerado no banco como senha.

O Authentication devo importar do import org.springframework.security.core.Authentication ?

4 respostas

Oi Michael,

Consegue compartilhar seu projeto para vermos o que pode ser o problema?

Ola Michael, tudo bem?

Faça uns testes

Como no return ResponseEntity.ok esta gerando um TokenDto, no lugar do nesse campo "@PostMapping public ResponseEntity autenticar(@RequestBody @Valid LoginForm form) " coloque TokenDto

alem disso tive problema tambem na parte do catch, tive que usar Exception ao inves de AuthenticationException senão o eclipse parava a compilação, basicamente o meu codigo do Controller ficou assim

package br.com.alura.forum.controller;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import br.com.alura.forum.config.security.TokenService;
import br.com.alura.forum.controller.dto.TokenDto;
import br.com.alura.forum.controller.form.LoginForm;

@Controller
@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);
            return ResponseEntity.ok(new TokenDto(token, "Bearer"));
        } catch(Exception e) {// verificar por que deu erro ao colocar AuthenticationException
            return ResponseEntity.badRequest().build();
        }


    }
}

Veja se lhe ajuda, porque normalmente esse erro indica que o servidor não identificou a senha como uma senha Bcrypt

Ah, outra coisa, dentro da classe LoginForm no curso, no metado converter o retorno esta invertido, esta como

return  new UsernamePasswordAuthenticationToken(senha,email);

Eu coloquei como

return  new UsernamePasswordAuthenticationToken(email,senha);

veja se isso tambem te ajuda a resolver.

solução!

Obrigado Diogo e Rodrigo, consegui resolver o problema, era erro de senha mesmo, priemeiro copiei o hash da senha do do curso que era igual a 123456 e salvei no banco de dados, ai enviei a requisiçãoe retornou o token normalmente, depois fiz alguns testes gerando o hash com

    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
    System.out.println("crip 123456 "+encoder.encode("123456"));

Ai gerei senhas diferentes, testei e funcionou, mas suspeito de algum erro de dependencia no POM, estava dando um erro em uma linha do parent, eu dei um update project e resolveu. Mas muitissimo obrigado a voces pela atenção, estou muito aliviado de ter resolvido.