GitHub
를 이용한 OAuth2 클라이언트 구현권한 부여 서버
: GitHubGitHub
계정이 있는 사람은 모두 이용할 수 있게 구성.
GibHub OAuth2 인증기 생성
setting
⇒developer settings
⇒OAuth Apps
⇒new oauth app
- 생성후 상세 페이지에서
client_id
와client_secret
를 발급 받을 수 있다.(security configuration 구성에 사용됨)
build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.18'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'org.spring.oauth2'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '11'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
tasks.named('test') {
useJUnitPlatform()
}
security configuration
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@Configuration
public class ProjectConfig extends WebSecurityConfigurerAdapter {
@Value("${oauth2.github.id}")
private String id;
@Value("${oauth2.github.secret}")
private String secret;
@Override
protected void configure(HttpSecurity http) throws Exception {
// OAuth2 사용 설정
http
.oauth2Login(client -> client
.clientRegistrationRepository(clientRegistrationRepository())
);
// 모든 end-point 인증 설정
http
.authorizeHttpRequests()
.anyRequest()
.authenticated();
}
private ClientRegistrationRepository clientRegistrationRepository() {
ClientRegistration clientRegistration = clientRegistration();
return new InMemoryClientRegistrationRepository(clientRegistration);
}
private ClientRegistration clientRegistration() {
return CommonOAuth2Provider.GITHUB
.getBuilder("github")
.clientId(id)
.clientSecret(secret)
.build();
}
}
코드 설명
clientRegistration()
: 인증 공급자 설정을 위한 설정clientId(id),clientSecret(secret)
: GitHub OAuth2에서 발급받은id
와secret
1
2
3
4
5
6
7
private ClientRegistration clientRegistration() {
return CommonOAuth2Provider.GITHUB
.getBuilder("github")
.clientId(id)
.clientSecret(secret)
.build();
}
clientRegistrationRepository()
: 기존에UserDetailsService
와 비슷한 역할ClientRegistrationRepository
객체는 등록ID
로ClientRegistration
를 찾는다
1
2
3
4
private ClientRegistrationRepository clientRegistrationRepository() {
ClientRegistration clientRegistration = clientRegistration();
return new InMemoryClientRegistrationRepository(clientRegistration);
}
http.oauth2Login(client->{...})
: oauth2인증 공급자를 설정해주는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
protected void configure(HttpSecurity http) throws Exception {
// OAuth2 사용 설정
http
.oauth2Login(client -> client
.clientRegistrationRepository(clientRegistrationRepository())
);
// 모든 end-point 인증 설정
http
.authorizeHttpRequests()
.anyRequest()
.authenticated();
}
페이지 접근 결과
- 리디렉션하는 url 정보
- http://localhost:8080/login/oauth2/code/github?code=…&state=…
OAuth2AuthenticationToken
OAuth2AuthenticationToken
:GitHub
에서 제공해주는 유저 정보
1
2
3
response info = Name: [86225268],
Granted Authorities: [[ROLE_USER, SCOPE_read:user]],
User Attributes: [{...}]