Вход в Google oauth2 при весенней загрузке, null refreshToken, сбой на удаленном сервере, работа на localhost - PullRequest
0 голосов
/ 06 мая 2020

У меня есть рабочий код в java 11 с весенней безопасностью и логином google oauth

@GetMapping("/google/integration")
public String googleIntegracionUsuario(@RegisteredOAuth2AuthorizedClient("google") OAuth2AuthorizedClient user, HttpServletRequest request, HttpServletResponse response) {
    System.out.println("\n\n RefreshToken: " + user.getRefreshToken().getTokenValue());
    System.out.println("\n\n AccessToken: " + user.getAccessToken().getTokenValue());
    return "hello user";
}

In @ Configuration

@Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .cors().and().csrf().disable()
                .authorizeRequests()
                .antMatchers("/google/integration").authenticated()
                .anyRequest().permitAll()
                .and()
                .oauth2Login()
                .authorizationEndpoint()
                .authorizationRequestResolver(new CustomAuthorizationRequestResolver(
                        this.clientRegistrationRepository));
    }

In CustomAuthorizationRequestResolver


public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver {
    private final OAuth2AuthorizationRequestResolver defaultAuthorizationRequestResolver;

    public CustomAuthorizationRequestResolver(
            ClientRegistrationRepository clientRegistrationRepository) {

        this.defaultAuthorizationRequestResolver =
                new DefaultOAuth2AuthorizationRequestResolver(
                        clientRegistrationRepository, "/oauth2/authorization");
    }

    @Override
    public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
        final OAuth2AuthorizationRequest authorizationRequest = this.defaultAuthorizationRequestResolver.resolve(request);
        return authorizationRequest != null ? customAuthorizationRequest(authorizationRequest) : null;
    }

    @Override
    public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) {
        final OAuth2AuthorizationRequest authorizationRequest = this.defaultAuthorizationRequestResolver.resolve(request, clientRegistrationId);
        return authorizationRequest != null ? customAuthorizationRequest(authorizationRequest) : null;
    }

    private OAuth2AuthorizationRequest customAuthorizationRequest(OAuth2AuthorizationRequest authorizationRequest) {

        Map<String, Object> additionalParameters = new LinkedHashMap<>(authorizationRequest.getAdditionalParameters());
        additionalParameters.put("access_type", "offline");

        return OAuth2AuthorizationRequest.from(authorizationRequest)
                .additionalParameters(additionalParameters)
                .build();
    }

}

и в .properties

spring.security.oauth2.client.registration.google.client-id=clientIdValue
spring.security.oauth2.client.registration.google.client-secret=clientSecret
spring.security.oauth2.client.registration.google.scope=https://www.googleapis.com/auth/calendar,email,https://www.googleapis.com/auth/contacts.readonly

Проблема в том, что при тестировании на локальном хосте все проходит гладко, но при загрузке проекта на удаленный сервер токен refre sh принимает значение NULL!

У меня нет домена для удаленного сервера, но я отредактировал / etc / hosts, чтобы указать псевдоним publi c ip удаленного сервера, И я добавил этот псевдоним к перенаправлениям URL в консоли Google разработчик

На удаленном сервере логин работает правильно, и пользователь фактически входит в систему со своей учетной записью Google, на самом деле я могу получить рабочий токен доступа пользователя на удаленном сервере, но refre sh токен нигде не может быть найден, значение просто равно нулю!

System.out.println("\n\n AccessToken: " + uuser.getAccessToken().getTokenValue());
//prints: AccessToken: 'AccessToken value' in localhost and remoteServer
System.out.println("\n\n AccessToken: " + user.getRefreshToken().getTokenValue());
//prints: RefreshToken: 'RefreshToken value' in localhost
//Throws NullPointerException in remoteServer

1 Ответ

0 голосов
/ 06 мая 2020

Я обнаружил, что токен refre sh на удаленном сервере получает значение только при первом входе пользователя в систему, и это ожидаемое поведение платформы oauth2. Но я не знаю, почему я постоянно получаю токен refre sh каждый раз на локальном хосте, и это меня смутило, я думаю, это потому, что он не привязан к определенному c url

...