Home Spring Security, OAuth2 GitHub Login(2)
Post
Cancel

Spring Security, OAuth2 GitHub Login(2)

  • GitHub를 이용한 OAuth2 클라이언트 구현

  • 권한 부여 서버 : GitHub

    • GitHub계정이 있는 사람은 모두 이용할 수 있게 구성.


GibHub OAuth2 인증기 생성

  • settingdeveloper settingsOAuth Appsnew oauth app

git_hub_oauth_create

  • 생성후 상세 페이지에서 client_idclient_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에서 발급받은 idsecret
1
2
3
4
5
6
7
  private ClientRegistration clientRegistration() {
    return CommonOAuth2Provider.GITHUB
      .getBuilder("github")
      .clientId(id)
      .clientSecret(secret)
      .build();
  }


  • clientRegistrationRepository() : 기존에 UserDetailsService와 비슷한 역할 ClientRegistrationRepository
    객체는 등록 IDClientRegistration를 찾는다
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();
}


페이지 접근 결과

oauth2_github

  • 리디렉션하는 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: [{...}]
This post is licensed under CC BY 4.0 by the author.