범위 토큰으로 API 실행

5039 단어 scope제어api

목차


  • 범위 정보
  • API 생성
  • 리소스 서버 설정
  • Keycloak에서 범위 설정
  • 액세스 토큰 발행

  • 참고 사이트


  • Keycloak과 SpringBoot / Security로 OpenID Connect (리소스 서버)

  • 범위 정보


  • OpenID Connect에서는 스코프를 복수 지정할 수 있다.
  • 사용자의 속성은 선택적으로 액세스 토큰에 포함될 수 있습니다.
  • 스코프를 사용해, 액세스 할 수 있는/불가능한 API를 만들 수 있다.
  • 스코프명에는 모두에 「SCOPE_」가 필요하게 된다.

  • API 생성



    다음 API를 작성합니다.


    아니
    API 이름
    API path
    스코프 이름
    Java 파일
    해설


    1
    Permit all
    /
    -
    PermitAllController.java
    모든 액세스 허용

    2
    Special
    /special
    SCOPE_special
    SpecialController.java
    'special' 범위가 있는 액세스 토큰에서만 액세스 가능

    3
    Get Object
    /getObject
    SCOPE_getObject
    GetObjectController.java
    'getObject' 범위가 있는 액세스 토큰에서만 액세스 가능


  • PermitAllController.java
  • import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class PermitAllController {
    
        @GetMapping("/")
        public String special() {
            return "Welcome!";
        }
    }
    
  • SpecialController.java
  • import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class SpecialController {
    
        @GetMapping("/special")
        public String special() {
            return "Special!";
        }
    }
    
  • GetObjectController.java
  • import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.Arrays;
    import java.util.List;
    
    @RestController
    public class GetObjectController {
    
        @GetMapping(path = "/getObject")
        public List<String> getObject() {
            return Arrays.asList("value1","value2","value3");
        }
    }
    

    리소스 서버 설정


  • 리소스 서버에 범위 매핑을 설정합니다.
  • import org.springframework.http.HttpMethod;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .antMatchers(HttpMethod.GET, "/special").hasAuthority("SCOPE_special")
                    .antMatchers(HttpMethod.GET, "/getObject").hasAuthority("SCOPE_getObject")
                    .antMatchers(HttpMethod.GET, "/").permitAll()
                    .anyRequest().authenticated();
            http.oauth2ResourceServer()
                    .jwt();
        }
    }
    

    Keycloak에서 범위 설정


  • 이하 API를 위해, special와 getObject의 스코프를 추가할 필요가 있다.

  • Keycloak 작업 정보 을 참고해, 「스코프, 매퍼의 작성과 클라이언트에 스코프를 설정한다」 부분대로 실시한다.



  • 아니
    API 이름
    API path
    스코프 이름


    1
    Special
    /special
    SCOPE_special

    2
    Get Object
    /getObject
    SCOPE_getObject


    API 실행




    아니
    API 이름
    API path
    액세스 토큰 발급 필요?


    1
    Permit all
    /
    필요 없음

    2
    Special
    /special
    필요

    3
    Get Object
    /getObject
    필요


    ①액세스 토큰 발행



    Special API의 토큰 발행을 위해, scope에 「openid {작성한 스코프 메이}」를 추가해 실행한다.
    ※openid는 필수
    ※Permit all API는, 액세스 토큰 발행은 필요 없다


    응답
    {
        "access_token": "xxxxxxx",
        "expires_in": 300,
        "refresh_expires_in": 0,
        "token_type": "Bearer",
        "id_token": "xxxxx",
        "not-before-policy": 0,
        "scope": "openid profile email special"
    }
    

    ②API 실행



    Special과 Get Object API의 경우 ①에서 취득한 액세스 토큰을 이용하여 API를 실행한다.



    Permit all API는 그대로 실행한다.

    좋은 웹페이지 즐겨찾기