복붙노트

[SPRING] OAuth2 및 JWT를 사용한 스프링 보안 : 암호화 된 암호가 BCrypt처럼 보이지 않습니다.

SPRING

OAuth2 및 JWT를 사용한 스프링 보안 : 암호화 된 암호가 BCrypt처럼 보이지 않습니다.

JWT를 사용하여 Spring AuthorizationServer를 구현하려고합니다. BCWrypt를 믹스에 추가 할 때까지 JWT 토큰을 생성하고 로그인 할 수있었습니다. 이제 로그인을 시도 할 때 API에서 "잘못된 자격 증명"을받습니다.

OAuth2Configuration.java

@Configuration
@EnableAuthorizationServer
public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter {

    private DataSource dataSource;
    private AuthenticationManager authenticationManager;
    private BCryptPasswordEncoder passwordEncoder;

    public OAuth2Configuration(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
        this.dataSource = new Jdbc3PoolingDataSource();
        this.passwordEncoder = new BCryptPasswordEncoder();
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.passwordEncoder(passwordEncoder);
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("api-client")
                .secret("verysecretivesecret")
                .scopes("READ", "WRITE", "DELETE")
                .authorizedGrantTypes("implicit", "refresh_tokens", "password", "authorization_code");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authorizationCodeServices(authorizationCodeServices())
                .tokenStore(tokenStore())
                .tokenEnhancer(jwtTokenEnhancer())
                .authenticationManager(authenticationManager);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(jwtTokenEnhancer());
    }

    @Bean
    protected JwtAccessTokenConverter jwtTokenEnhancer() {
        return new JwtAccessTokenConverter();
    }

    @Bean
    protected AuthorizationCodeServices authorizationCodeServices() {
        return new JdbcAuthorizationCodeServices(dataSource);
    }

}

WebSecurityConfig.java

@Configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    private AccountDetailsService accountDetailsService;
    private BCryptPasswordEncoder passwordEncoder;
    private DataSource dataSource;

    WebSecurityConfig(AccountDetailsService accountDetailsService) {
        this.accountDetailsService = accountDetailsService;
        this.dataSource = new Jdbc3PoolingDataSource();
        this.passwordEncoder = new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(accountDetailsService).passwordEncoder(passwordEncoder).and().jdbcAuthentication().dataSource(dataSource);
    }
}

SeedData.java

@Override
public void run(String... args) throws Exception {      

    Stream.of("alan,test").map(x -> x.split(","))
            .forEach(tuple -> {
                Account user = new Account();
                user.setUsername(tuple[0]);
                user.setPassword(new BCryptPasswordEncoder().encode(tuple[1]));
                user.setEmail(tuple[0]);
                user.setRoles(Collections.singletonList(role));
                user.setActive(true);
                this.accountRepository.save(user);
            });
}

당신의 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.나는 그것을하기 위해 다음과 같은 변화를 만들어야했다. 다른 사람이 필요하면.

    나는 그것을하기 위해 다음과 같은 변화를 만들어야했다. 다른 사람이 필요하면.

    @Override
            protected void configure(AuthenticationManagerBuilder auth) throws Exception {
                auth.userDetailsService(accountDetailsService)
                        .passwordEncoder(passwordEncoder)
                        .and()
                        .authenticationProvider(authenticationProvider())
                        .jdbcAuthentication()
                        .dataSource(dataSource);
            }
    
        @Bean
        public DaoAuthenticationProvider authenticationProvider() {
            DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
            authenticationProvider.setUserDetailsService(accountDetailsService);
            authenticationProvider.setPasswordEncoder(passwordEncoder);
            return authenticationProvider;
        }
    
  2. ==============================

    2.이는 WebSecurity와 AuthorizationServer에 둘 다 BCrypt를 적용했기 때문입니다. 따라서 저장소에 암호화 된 사용자 암호를 BCrypt로 저장하지 말고 OAuth2에 대해 암호화 된 클라이언트 암호를 BCrypt로 유지해야합니다. 나는 이것이 당신이 접근하려고 한 것이 아니란 것 같아요.

    이는 WebSecurity와 AuthorizationServer에 둘 다 BCrypt를 적용했기 때문입니다. 따라서 저장소에 암호화 된 사용자 암호를 BCrypt로 저장하지 말고 OAuth2에 대해 암호화 된 클라이언트 암호를 BCrypt로 유지해야합니다. 나는 이것이 당신이 접근하려고 한 것이 아니란 것 같아요.

    코드를 작동 시키려면 다음 중 하나를 제거하십시오.

       @Override
        public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
            security.passwordEncoder(passwordEncoder);
        }
    

    또는 귀하의 "비밀 자격 박탈"

  3. from https://stackoverflow.com/questions/40699532/spring-security-with-oauth2-and-jwt-encoded-password-does-not-look-like-bcrypt by cc-by-sa and MIT license