URI не является абсолютным при попытке аутентификации в другом сервисе - PullRequest
0 голосов
/ 10 мая 2019

Я пишу приложение для микроуслуг. У меня есть пользовательский сервис с сервером аутентификации и автосервисом. Я хочу добавить некоторые значения в автосервис, но есть проблема с аутентификацией:

WARN 30049 --- [nio-8081-exec-2] o.s.b.a.s.o.r.UserInfoTokenServices      : Could not fetch user details: class java.lang.IllegalArgumentException, URI is not absolute

Я искал в интернете, но не нашел ответа, как решить эту проблему.

применение. Свойства в автосервисе

#security
spring.security.oauth2.client.registration.client-id=frontendClientId
spring.security.oauth2.client.registration.client-secret=frontendClientSecret
spring.security.oauth2.client.registration.authorization-grant-type=client_credentials

spring.security.oauth2.client.provider.token-uri=http://localhost:8082/oauth/token/
spring.security.oauth2.client.provider.user-info-uri=http://localhost:8082/user/current/

настройка сервера ресурсов в автосервисе

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    private final ResourceServerProperties sso;
    private final OAuth2ClientContext oAuth2ClientContext;


    @Autowired
    public ResourceServerConfig(ResourceServerProperties sso, @Qualifier("oauth2ClientContext")  OAuth2ClientContext oAuth2ClientContext) {
        this.sso = sso;
        this.oAuth2ClientContext = oAuth2ClientContext;
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.security.oauth2.client")
    public ClientCredentialsResourceDetails clientCredentialsResourceDetails() {
        return new ClientCredentialsResourceDetails();
    }

    @Bean
    public RequestInterceptor oauth2FeignRequestInterceptor() {
        return new OAuth2FeignRequestInterceptor(oAuth2ClientContext, clientCredentialsResourceDetails());
    }


    @Bean
    public OAuth2RestOperations restTemplate(@Qualifier("oauth2ClientContext")OAuth2ClientContext oauth2ClientContext) {
        return new OAuth2RestTemplate(clientCredentialsResourceDetails(), oauth2ClientContext);
    }




    @Bean
    @Primary
    public ResourceServerTokenServices resourceServerTokenServices() {
        return new UserInfoTokenServices(sso.getUserInfoUri(), sso.getClientId());
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest()
                .hasRole("ADMIN")
                .and()
                .csrf().disable();
    }
}

Главный автосервис

@SpringBootApplication
@EnableEurekaClient
@EnableOAuth2Sso
public class CarServiceApp {

    public static void main(String[] args) {
        SpringApplication.run(CarServiceApp.class, args);
    }
}

config сервера авторизации - пользовательский сервис

@Configuration
@EnableAuthorizationServer
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {

    private final DataSource dataSource;
    private final AuthenticationManager authenticationManager;
    private final PasswordEncoder passwordEncoder;
    private final UserDetailsServiceImpl userDetailsService;

    @Autowired
    public AuthorizationServer(DataSource dataSource,
                               AuthenticationManager authenticationManager,
                               PasswordEncoder passwordEncoder,
                               UserDetailsServiceImpl userDetailsService){
        this.dataSource = dataSource;
        this.authenticationManager = authenticationManager;
        this.passwordEncoder = passwordEncoder;
        this.userDetailsService = userDetailsService;
    }


    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security
                .tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()")
                .passwordEncoder(passwordEncoder)
                .allowFormAuthenticationForClients();;
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                .tokenStore(tokenStore())
                .authenticationManager(authenticationManager)
                .userDetailsService(userDetailsService);

    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients
                .inMemory()
                .withClient("frontendClientId")
                .secret(passwordEncoder.encode("frontendClientSecret"))
                .authorizedGrantTypes("password", "authorization_code", "refresh_token")
                .accessTokenValiditySeconds(3600)
                .refreshTokenValiditySeconds(28*24*3600)
                .scopes("read");

    }

    @Bean
    public TokenStore tokenStore(){
        return new MyJdbcTokenStore(this.dataSource);

    }
}

ресурс-сервер пользователя-сервис

@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/oauth/**", "/user/register")
                .permitAll()
                .anyRequest().authenticated()
        .and()
        .csrf().disable();
    }

}

пользовательский сервис веб-безопасности

@Configuration
@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    private final UserDetailsServiceImpl userDetailsService;

    @Autowired
    public WebSecurity(UserDetailsServiceImpl userDetailsService){
        this.userDetailsService = userDetailsService;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .userDetailsService(this.userDetailsService)
                .passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().denyAll()
                .and()
                .formLogin().disable();

    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

Я вызываю oauth / token для получения токена, затем я вызываю автосервис с токеном, но он возвращает

{
    "error": "invalid_token",
    "error_description": "0175bf49-1f9f-4797-aade-1ce5b18dccf6"
}

и тогда это ПРЕДУПРЕЖДЕНИЕ, которое я написал в начале, находится в журналах весны.

Можете ли вы помочь, пожалуйста?

...