이번에는 클라이언트 정보를 DB에 저장해놓고 사용하는 방식으로 변경해보겠습니다.
H2 DB를 사용하므로 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
도 같이 출력해줍시다.
@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문을 작성해봅시다.
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를 수정합니다.
@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);
}
}
기존에 셋팅해놓은 로그인 정보를 수정해줍시다.
@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();
}
}
모든 설정은 끝났으니 인증을 받아봅시다.
기존과 같이 나온다면 정상적으로 처리되었습니다.