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

Error Bad request

Olá poderiam me ajudar ? Eu ja finalizei todas as aulas do curso, mas quando vou efetuar login após as mudanças da aula 5, ao executar o codigo está retornando uma exception, eu até printei os dados enviados para ter certeza que esta tudo correto. Já realizei uma comparacao lado a lado com o projeto final do curso, mas não consegui encontrar a causa do problema.

Exception:

voll_med    | Login:ana.souza@voll.med
voll_med    | Password:$2a$10$Y50UaMFOxteibQEYLrwuHeehHYfcoafCopUazP12.rqB41bsolF5.
voll_med    | UsernamePasswordAuthenticationToken [Principal=ana.souza@voll.med, Credentials=[PROTECTED], Authenticated=false, Details=null, Granted Authorities=[]]
voll_med    | Hibernate: 
voll_med    |     select
voll_med    |         u1_0.id,
voll_med    |         u1_0.login,
voll_med    |         u1_0.password 
voll_med    |     from
voll_med    |         USERS u1_0 
voll_med    |     where
voll_med    |         u1_0.login=?
voll_med    | org.springframework.security.authentication.BadCredentialsException: Bad credentials
voll_med    |   at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:89)
voll_med    |   at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:147)
voll_med    |   at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:182)
voll_med    |   at com.alura.voll_med.controller.AuthenticationController.makeLogin(AuthenticationController.java:41)
voll_med    |   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
voll_med    |   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
voll_med    |   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
voll_med    |   at java.base/java.lang.reflect.Method.invoke(Method.java:568)

Controller: O erro esta acontecendo nessa linha: var authentication = manager.authenticate(authenticationToken);

@RestController
@RequestMapping("/login")
public class AuthenticationController {
    
    @Autowired
    private AuthenticationManager manager;

    @Autowired
    private TokenManagerService tokenService;

    @PostMapping
    public ResponseEntity makeLogin(@RequestBody @Valid AuthenticationDataDTO authDTO){
        try {
            
            System.out.println("Login:"+authDTO.login());
            System.out.println("Password:"+authDTO.senha());

            var authenticationToken = new UsernamePasswordAuthenticationToken(authDTO.login(), authDTO.senha());
            
            var authentication = manager.authenticate(authenticationToken);
            System.out.println("Authentication Object:"+authentication);
            
            var tokenJWT = tokenService.generateToken((User)authentication.getPrincipal());
            
            return ResponseEntity.ok(new AuthenticationTokenDTO(tokenJWT));
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.badRequest().body(e.getMessage());
        }  
    }
}

Requisicao no Postman: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Banco de dados:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como da para perceber o usuario e senha enviados na requisicao sao os mesmos armazenados no banco de dados.

3 respostas
solução!

Oi!

Veja aqui: https://cursos.alura.com.br/course/spring-boot-aplique-boas-praticas-proteja-api-rest/task/130894

O seu caso é a opção 3, na parte de observações. Você está enviando no json a senha em bcrypt ao invés do texto aberto (123456)

Humberto,

Normalmente, quando você encripta uma senha, e só para não deixar a senha explicitamente gravada no seu banco de dados, ou seja o correto para fazer o login dentro do postman você teria que passar a senha como ela foi registrada mesmo, não ela encriptograda no banco de dados.

exemplo no Postman:


{
    "login":"ana.souza@voll.med"
    "senha":"//aqui você digita a senha corretamente, por exemplo se você cadastrou 1234 coloque 1234"
}

Obs.: Vale ressaltar que a propria aplicação já desencripta a senha e verifica se a que você passou está igual a que foi salva no banco.

Opa! Valeu! deu certo aqui. Toda vez que tenho que fazer o login via postman com a senha em texto aberto me da um mini ataque cardiaco, mas tudo bem, para o curso ta valendo.