Добавление параметра google login_hint в запрос Spring oauth2 AuthorizationCode - PullRequest
0 голосов
/ 28 сентября 2018

Я пытался добавить параметр запроса в фильтр запроса oauth2 источника AuthorizationCode, который отправляет google в рамках процесса проверки подлинности oauth2.В частности, мне нужно добавить параметр login_hint, чтобы запретить Google указывать пользователям выбирать свои учетные записи, когда адрес электронной почты уже известен.

Это моя первоначальная конфигурация:

@Configuration
@EnableOAuth2Client
@RequiredArgsConstructor
public class OAuthSecurityConfiguration extends WebSecurityConfigurerAdapter {
    private static final String LOGIN_PATH = "/oauth/login";

    private static final int OAUTH2_CLIENT_FILTER_ORDER = -100;

    static {
        SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
    }

    private final OAuth2ClientContext oauth2ClientContext;

    private final OAuth2ClientContextFilter oAuth2ClientContextFilter;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        final OAuth2ClientAuthenticationProcessingFilter ssoFilter = new OAuth2ClientAuthenticationProcessingFilter(LOGIN_PATH);
        ssoFilter.setRestTemplate(googleRestTemplate());
        ssoFilter.setTokenServices(tokenServices());
        ssoFilter.setAuthenticationManager(oAuth2AuthenticationManager());

        final OAuth2AuthenticationProcessingFilter clientFilter = new OAuth2AuthenticationProcessingFilter();
        clientFilter.setAuthenticationManager(oAuth2AuthenticationManager());
        clientFilter.setStateless(false);

//      @formatter:off
        http
            .csrf().disable()
            .cors().disable()
            .headers()
            .frameOptions().sameOrigin()
            .cacheControl().disable()
            .and()
            .antMatcher("/**")
                .csrf().disable()
                .httpBasic().disable()
                .rememberMe().disable()
                .addFilterBefore(ssoFilter, BasicAuthenticationFilter.class)
                .addFilterBefore(clientFilter, OAuth2ClientAuthenticationProcessingFilter.class)
                .authorizeRequests()
            .antMatchers("/api/**").fullyAuthenticated()
            .anyRequest().permitAll()
            .and()
            .logout().logoutUrl("/logout")
            .and() .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint());
//      @formatter:on
    }

Единственный способ, которым мне удалось это сделать, заключается в следующем:

    @Bean
    public OAuth2RestTemplate googleRestTemplate() {
        MyAuthorizationCodeAccessTokenProvider myAuthorizationCodeAccessTokenProvider =
            new MyAuthorizationCodeAccessTokenProvider();

        AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(
            Arrays.<AccessTokenProvider>asList(
                myAuthorizationCodeAccessTokenProvider, new ImplicitAccessTokenProvider(),
                new ResourceOwnerPasswordAccessTokenProvider(), new ClientCredentialsAccessTokenProvider()));

        OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(googleClient(), oauth2ClientContext);
        oAuth2RestTemplate.setAccessTokenProvider(accessTokenProvider);
        return oAuth2RestTemplate;
    }

    static class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAccessTokenProvider {
        private static String EMAIL_PARAM_NAME = "email";
        @Override
        public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request)
            throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException,
            OAuth2AccessDeniedException {
            try {
                return super.obtainAccessToken(details, request);
            } catch (UserRedirectRequiredException ex) {
                String email = request.containsKey(EMAIL_PARAM_NAME) ? request.get(EMAIL_PARAM_NAME).get(0) : null;
                if (email != null) {
                    ex.getRequestParams().put("login_hint", email);
                }
                throw ex;
            }
        }
    }
}

Это лучший способ настроитьSpring oauth2 для установки параметра login_hint в запросе авторизации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...