Spring Boot OAuth2 인증서버 적용기 - 4

황남욱·2021년 12월 16일
0
post-thumbnail

이번에는 클라이언트 정보를 DB에 저장해놓고 사용하는 방식으로 변경해보겠습니다.

H2 DB를 사용하므로 schema.sql에 아래와 같이 추가합니다.

schema.sql

CREATE TABLE IF NOT EXISTS oauth_client_details (
    client_id VARCHAR(256) PRIMARY KEY,
    resource_ids VARCHAR(256),
    client_secret VARCHAR(256),
    scope VARCHAR(256),
    authorized_grant_types VARCHAR(256),
    web_server_redirect_uri VARCHAR(256),
    authorities VARCHAR(256),
    access_token_validity INTEGER,
    refresh_token_validity INTEGER,
    additional_information VARCHAR(4096),
    autoapprove VARCHAR(256)
);

DB를 생성했으니 데이터를 넣어주어야 하는데 clinet_secret에는 암호화된 client_secret값을 넣어주어야 하므로 Main Class에서 임의로 암호화 된 값을 받아옵니다.

이후 사용할 USER / PASSWORD에서도 암호화 된 값이 필요하므로
비밀번호로 사용될 pass도 같이 출력해줍시다.

OAuthApplication.java


@SpringBootApplication
public class MyClosetOauthApplication{

    public static void main(String[] args) {
        PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        System.out.println(passwordEncoder.encode("bar"));
	System.out.println(passwordEncoder.encode("pass"));
        SpringApplication.run(MyClosetOauthApplication.class, args);
    }

}

로그에 찍힌 값을 통해 INSERT문을 작성해봅시다.

data.sql

insert into oauth_client_details(client_id, resource_ids,client_secret,scope,authorized_grant_types,web_server_redirect_uri,authorities,access_token_validity,refresh_token_validity,additional_information,autoapprove)
values(
       'mycloset',
       null,
       '{bcrypt}$2a$10$Dp7dXcuT5cGW9clQRfJKIe22EVV7rNCjntXWBE6f0e8nPuu6GlRq6',
       'read,write',
       'authorization_code,refresh_token',
       'http://localhost:1995/oauth2/callback',
       'ROLE_USER',
       36000,
       50000,
       null,
       null
    );

그리고 InMemory방식으로 설정해놓았던 OAuth2AuthorizationConfig를 수정합니다.

OAuth2AutorizationConfig


@Configuration
@EnableAuthorizationServer
@RequiredArgsConstructor
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter {

    private final DataSource dataSource;
    private final PasswordEncoder passwordEncoder;
    
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception{
        clients.jdbc(dataSource).passwordEncoder(passwordEncoder);
    }

}

SecurityConfig

기존에 셋팅해놓은 로그인 정보를 수정해줍시다.


@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user")
                .password("{bcrypt}$2a$10$Dp7dXcuT5cGW9clQRfJKIe22EVV7rNCjntXWBE6f0e8nPuu6GlRq6")
                .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable()
                .headers().frameOptions().disable()
                .and()
                .authorizeRequests()
                .antMatchers(
                        "/oauth/**",
                        "/oauth2/callback",
                        "/h2/**"
                ).permitAll()
                .and()
                .formLogin().and()
                .httpBasic();
    }
}

모든 설정은 끝났으니 인증을 받아봅시다.

http://localhost:1995/oauth/authorize?client_id=foo&redirect_uri=http://localhost:1995/oauth2/callback&response_type=code&scope=read

기존과 같이 나온다면 정상적으로 처리되었습니다.

profile
안녕하세요👋 주니어 백엔드 개발자입니다.

0개의 댓글