OAuth 2.0 Resource Server Opaque - 토큰 검사 프로세스
Last updated
Last updated
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.oauth2ResourceServer(oauth2 -> oauth2.opaqueToken(Customizer.withDefaults()))
;
return http.build();
}
@Bean
public OpaqueTokenIntrospector opaqueTokenIntrospector(OAuth2ResourceServerProperties properties) {
return new CustomOpaqueTokenIntrospector(properties);
}
}public class CustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector {
private OpaqueTokenIntrospector delegate;
public CustomOpaqueTokenIntrospector(OAuth2ResourceServerProperties properties) {
delegate = new NimbusOpaqueTokenIntrospector(
properties.getOpaquetoken().getIntrospectionUri(),
properties.getOpaquetoken().getClientId(),
properties.getOpaquetoken().getClientSecret()
);
}
@Override
public OAuth2AuthenticatedPrincipal introspect(String token) {
OAuth2AuthenticatedPrincipal principal = delegate.introspect(token);
return new DefaultOAuth2AuthenticatedPrincipal(
principal.getName(),
principal.getAttributes(),
extractAuthorities(principal)
);
}
private Collection<GrantedAuthority> extractAuthorities(OAuth2AuthenticatedPrincipal principal) {
List<String> scopes = principal.getAttribute(OAuth2TokenIntrospectionClaimNames.SCOPE);
return scopes.stream()
.map(scope -> "ROLE_" + scope.toUpperCase())
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
}
}