2017-11-23 15 views
3

스프링 oauth 프레임 워크를 사용하면서 발견 한 자원 서버는 승인 서버에 대한 check_token?token=T_O_K_E_N 요청을 작성하는 자원 서버이며 권한 서버는 다음과 같은 권한으로 CheckTokenEndPoint 맵을 반환합니다.스프링 oauth : 승인 서버 대신 자원 서버가 승인하는 이유

{ 
    "exp": 1511471427, 
    "user_name": "idvelu", 
    "authorities": [ 
     "FUNCTION_GET_USERS", 
     "FUNCTION_AUTHORITY_1", 
     "FUNCTION_AUTHORITY_2", 
     "FUNCTION_AUTHORITY_3", 
     "FUNCTION_AUTHORITY_4", 
     "FUNCTION_AUTHORITY_5", 
     "FUNCTION_AUTHORITY_6", 
     "FUNCTION_AUTHORITY_7", 
    ], 
    "client_id": "c1", 
    "scope": [ 
     "read", 
     "write" 
    ] 
} 

oauth 서비스로 이것을 시각화하면 리소스 서비스가 두 개의 다른 시스템/jvm에서 실행됩니다.

이제 자원 서버는 구성된 유효 권한에 대한 요청을 ResourceServerConfiguration::configure(HttpSecurity)에 권한 부여 서버의 권한으로 승인해야한다고 생각합니다.

@Override 
public void configure(HttpSecurity http) throws Exception { 
http.anonymous().disable().requestMatchers().antMatchers("/**").and().authorizeRequests() 

     .antMatchers(HttpMethod.GET, "/myproject/users").hasAnyAuthority("FUNCTION_GET_USERS") 
     .antMatchers(HttpMethod.POST, "/myproject/users").hasAnyAuthority("FUNCTION_POST_NEW_USER") 
     .anyRequest().denyAll() 
     .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler()); 
} 

이 경우 권한 서버는 수백 개의 모든 사용자 권한을 자원 서버로 리턴 할 수 있습니다. 대신 인증 서버 자체가 인증에 필요한 몇 가지 권한을 리소스 서버의 쿼리 매개 변수
check_token?token=T_O_K_E_N&authorities=FUNCTION_GET_USERS,FUNCTION_AUTHORITY_2,..
으로 가져 와서 DB를 통해 사용자 기능에 대해 유효성을 검사 할 수있는 이유는 무엇입니까?

그리고 마지막으로 내 문제는; 나는 java, node.js, NGINX와 같은 다른 서비스를 가지고있다. 이들 모두는 하나의 Spring Authorization 서버에 대한 인증과 권한 부여를 검증해야한다. 위에서 언급 한 문제로 인해 모든 서비스가 인증 (리소스 서버) 부분을 구현해야합니다. 사용자의 모든 권한을 API 권한 당국과 비교하는 것을 의미합니다.
자바 측에서는 스프링 리소스 서버 구현과 비교해도 괜찮습니다. 그러나 다른 모든 Java가 아닌 (자원) 서비스에는 authorization/resourceServer 구현이 필요합니다. 대신 내 스프링 인증 서버가 권한을 승인하고 유효성 검사를하면 내 문제는 인증/비교 구현의 단일 지점으로 해결됩니다. check_token의 일부로 전달하면됩니다.

권한을 수락하는 것과 함께이 새로운 check_token 끝점을 구현하는 방법은 무엇입니까?

+0

질문 조금 명확하지 않습니다. 정확한 질문에 대해 더 자세히 설명해 주시겠습니까? –

+0

@AtaurRahmanMunna 리소스 서버에서 권한 부여를 요청하는 이유는 무엇입니까? 여기서 권한 부여 서버는 권한 부여 대신 단순히 권한 목록 만 리턴하고 있습니까? –

+0

** 보호 ** 리소스에 액세스하려고했으며 리소스를 제공하기 전에 리소스 서버가 올바른 토큰을 가지고 있는지 확인해야합니다. 여기서 권한 부여 서버는 토큰을 제공하기 전에 사용자 이름과 암호 만 인증합니다. –

답변

2

인증 서버는 사용자/클라이언트 인증을 담당합니다 (사용하는 인증 유형에 따라 다름). 이 작업이 완료되면 토큰이 제공됩니다.

사용자/클라이언트가 리소스 서버에 자신을 제시하고 서비스를 사용하려면 토큰을 제공해야합니다. 이제 자원 서버에 토큰이 있으며이 토큰이 권한 서버에 의해 생성되었는지 검증해야합니다. 두 가지 옵션이 있습니다.

  1. 토큰 자체에는 정보가 없습니다. 자원 서버는 권한 서버를 호출하고 토큰이 유효한지 여부를 묻습니다. 권한 서버는 토큰이 유효하다고 응답하고 몇 가지 추가 정보 (사용자/클라이언트, 역할/범위 등)를 제공합니다.
  2. 토큰에 필요한 정보가 들어 있습니다 (예 : JWT 토큰). 이렇게하면 자원 서 v가 권한 서 v에 접속하지 않고도 필요한 정보를 추출 할 수 있습니다. 이 경우, 권한 서 v는 토큰에 서명하고 자원 서 v는 토큰을 발급 한 자동 화 서 v인지 확인하기 위해 서명의 유효성을 검증 할 수 있습니다.

현재로서는 첫 번째 시나리오를 사용하고 있습니다. 작성한 모든 자원 서버는 토큰을 확인하고 추가 정보를 추출해야합니다. 확인이 수행되는 방}은 권한 서 v에 따라 다 (니다.

파트 2는 :

귀하의 질문은 나에게 분명하지 않다.OWuth2 authorization code 체계를 JWT 이외의 토큰과 함께 사용하고 있습니까?

그런 경우 인증을 담당하는 인증 서버, 일부 서비스를 제공하는 리소스 서버 및 리소스 서버를 사용하는 클라이언트가 있습니다.

내가 실수하지 않는다면 서로 다른 리소스 서버 (API)가 있습니까?

인증 서버 구성을 공유하지 않았지만 일반적으로 @EnableAuthorizationServer을 사용합니다. 그러면 종단점 /oauth/check_token이 생성됩니다. 기본적으로이 끝점은 지나치지 않습니다. 다음과 같이해야합니다.

@Override 
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception 
{ 
    oauthServer.checkTokenAccess("permitAll()"); // authenticated is better 
} 

토큰의 유효성을 검사 할 때이 끝점을 사용할 수 있습니다.

모든 내용은 oauth2 developer guide에 설명되어 있습니다.

파트 3 : 인증 서버에서

, 당신은 다음과 같이 엔드 포인트를 만들 수 있습니다

@RequestMapping("/user") 
public Principal user(Principal principal) { 

    if(principal instanceof OAuth2Authentication) { 
     return (OAuth2Authentication) principal; 
    } else { 
     return principal; 
    } 
} 

당신은 당신의 필요에 맞게 수정할 수 있습니다.

+0

감사합니다. plusOne,하지만 oauth가 어떻게 작동하는지 알아. 그리고 저는 그것을 다른 방식으로 원합니다. 내 질문을 업데이트했습니다. –

+0

답변을 업데이트/추가하고 기존 답변을 삭제하지 마십시오. 유용합니다. –

+0

감사합니다 !! 나는 간단한 액세스 토큰 (nonwwt)을 기반으로 봄 ouath 및 리소스 서버를 사용하고 있습니다. 자원 서버의 역할/기능 비교 부분이 인증 서버 자체에 있어야합니다. 이게 oauth 범위 밖일 수 있습니다 ..? –