잘못된 자격증명
이 뜨는 경우가 많으나 그 중 한 가지 경우에 대해 이야기를 해보려고 한다.
사진과 같이 토큰을 요청했다.
현재 DB에는 다음과 같은 정보가 들어있다.
username : robin.kwon@opensurvey.co.kr
password : (passwordEncoder.encode("pasword") 를 한 값)
이 때 사진과 같이 정상적으로 요청을 했을 때도 잘못된 자격증명
이라는 오류를 뱉는다.
생각을 해보니 DB 에 있는 `robin.kwon@opensurvey.co.kr` 이란 데이터의 encoding 된 password 값이 일치하지 않아 발생하는 것 같다고 생각했다.
즉, 토큰 요청 시 다음과 같이 동작되야 토큰 요청이 정상적으로 수행이 될 것이다.
passwordEncorder.match(user.password, "password");
그래야 encoding 된 password 가 일치하는지 알 수 있을 것 같다.
이럴 땐 DaoAuthenticationProvider
를 return 메소드를 @Bean
으로 등록하면 된다. 아래의 코드를 보자.
/**
* POST '/oauth/token' 요청 시 PasswordEncoder 로 패스워드 일치하는지 확인하도록 하기 위해 Bean 등록.
* An 'AuthenticationProvider' implementation that retrieves user details from a 'UserDetailsService'.
*
* @return DaoAuthenticationProvider
*/
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setPasswordEncoder(passwordEncoder);
provider.setUserDetailsService(userService);
return provider;
}
친철하게 주석까지 달아놓았다. DaoAuthenticationProvider
클래스를 살펴보면 주석에 잘 설명을 해주었다. 위의 코드에도 똑같은 주석을 달아놓았다.
즉, DaoAuthenticationProvider
객체에 각각 PasswordEncoder
, UserDetailsSerivce
를 set 해주면 된다.
그러면 이제 토큰 요청 시 PasswordEncoder
를 통해 password 가 매칭되는지 확인하고 정상적으로 토큰을 발급해줄 것이다.
코드는 다음의 링크에서 확인하도록 하자. 아직 미완성이나 정상적으로 토큰 발급은 해준다.
https://github.com/hojak99/one-hudred-million-plan/tree/e4130a5d89808d60efe846119bdaff326afbd0f0