Spring Oauth2 редирект URI не меняется - PullRequest
0 голосов
/ 17 января 2019

Я работаю над авторизацией OAuth2 весной и пытаюсь реализовать поток разрешений authorization code. Теперь у меня есть два приложения. Клиентская сторона и сервер авторизации. Когда я открываю защищенный /client/hello, он перенаправляет меня на страницу входа oauth2, после чего ссылка get /oauth/authorize, но в значении redirect_uri всегда является страницей входа на стороне клиента и даже не изменяется вручную в браузере. Как я могу это изменить? Если я изменяю URI перенаправления на /client/login в конфигурации сервера аутентификации, он перенаправляет и дает мне код авторизации, но вызывает неавторизованную ошибку.

Клиент

Контроллер:

@RestController
public class Controller {
    @GetMapping("/hello")
    public String hello() {
        return "Hello world!!";
    }

    @GetMapping("/public")
    public String publicPage() {
        return "This is public!!";
    }

    @GetMapping("/callback")
    public String login(@RequestParam("code") String code) {
        return code;
    }
}

Конфигурация безопасности клиента:

@Configuration
@EnableOAuth2Sso
public class ClientSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/error**", "/public**").permitAll()
                .anyRequest().authenticated();
    }
}

Свойства клиента:

security.oauth2.client.client-id=007314
security.oauth2.client.client-secret=MDA3MzE0
security.oauth2.client.grant-type=password
security.oauth2.client.scope=read
security.oauth2.client.pre-established-redirect-uri=http://localhost:8081/client/public
security.oauth2.client.access-token-uri=http://localhost:8082/auth/oauth/token
security.oauth2.client.user-authorization-uri=http://localhost:8082/auth/oauth/authorize
security.oauth2.client.authentication-scheme=form
security.oauth2.resource.user-info-uri=http://localhost:8081/client/hello
security.oauth2.resource.id=resource-server-rest-api

server.port=8081
server.servlet.context-path=/client

Сервер авторизации Конфигурация сервера:

@Configuration
@EnableAuthorizationServer
public class AuthorizationServer extends AuthorizationServerConfigurerAdapter {


    private final PasswordEncoder passwordEncoder;
    @Qualifier("authenticationManagerBean")
    private final AuthenticationManager authenticationManager;

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

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

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("007314")
                .secret(passwordEncoder.encode("007314"))
                .authorizedGrantTypes("authorization_code", "refresh_token")
                .scopes("read")
                .resourceIds("resource-server-rest-api")
                .autoApprove(true)
                .redirectUris("http://localhost:8081/client/hello");
    }

    @Bean
    public TokenStore tokenStore(){
        return new JwtTokenStore(defaultAccessTokenConverter());
    }
    @Bean
    public JwtAccessTokenConverter defaultAccessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        converter.setSigningKey("123");
        return converter;
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.tokenStore(tokenStore())
                .accessTokenConverter(defaultAccessTokenConverter())
                .authenticationManager(authenticationManager);
    }
}

Конфигурация безопасности сервера:

@EnableWebSecurity
@Order(1)
public class ServerSecurityConfig extends WebSecurityConfigurerAdapter {

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

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(passwordEncoder())
                .withUser("qwerty")
                .password(passwordEncoder().encode("12345"))
                .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/error**", "/login**", "/oauth/authorize**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin().permitAll();
    }
}

Сервер ресурсов

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    private static final String RESOURCE_ID = "resource-server-rest-api";
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId(RESOURCE_ID);
    }
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers(HttpMethod.GET, "/client/hello").access("#oauth2.hasScope('read')");
    }
}

Свойства сервера:

server.port=8082
server.servlet.context-path=/auth

1 Ответ

0 голосов
/ 10 апреля 2019

Добавьте также: security.oauth2.client.useCurrentUri=false в client.properties.

...