Невозможно получить информацию электронной почты из информации UserProfile в SSO, используя Google с Oauth2 в приложении Spring - PullRequest
2 голосов
/ 02 ноября 2019

У меня есть SSO интеграция с моим Приложением, используя Google SSO Login. Мне удалось получить информацию из Google UserProfile до 20 октября, и пользователь смог успешно войти в приложение.

Но после 20 октября пользователь не смог войти в систему с помощью единого входа, поскольку я не получал информацию по электронной почте отGoogle. Я не знаю, что вдруг произошло со стороны Google Oauth, что я не получаю данные.

Я видел из консоли администратора Google Developer, что все API включены, включая People, Google+ и у меня одинаковые client_id и Secret key в свойствах моего приложения, которые присутствуют в консоли разработчика. Я попытался изменить область.

В настоящее время область, которую я установил в Приложении, была областью электронной почты, и я получал информацию за последние 2 года. Я изменил на Профиль, установил область для профиля, но после этого я также получил только информацию об имени, а не адрес электронной почты и другую информацию.

<dependency>


<groupId>org.springframework.social</groupId>


<artifactId>spring-social-google</artifactId>


<version>1.0.0.RELEASE</version>

</dependency>

Код:

public class GoogleConnectionFactory extends OAuth2ConnectionFactory<Google> {

        public GoogleConnectionFactory(String clientId, String clientSecret) {
            super("google", new GoogleServiceProvider(clientId, clientSecret),
                    new GoogleAdapter());
        }



@Override
        protected String extractProviderUserId(AccessGrant accessGrant) {
            Google api = ((GoogleServiceProvider)getServiceProvider()).getApi(accessGrant.getAccessToken());
            UserProfile userProfile = getApiAdapter().fetchUserProfile(api);
            return userProfile.getUsername();
        }
    }

public Connection<S> createConnection(AccessGrant accessGrant) {

        return new OAuth2Connection<S>(getProviderId(), extractProviderUserId(accessGrant), accessGrant.getAccessToken(),
                accessGrant.getRefreshToken(), accessGrant.getExpireTime(), getOAuth2ServiceProvider(), getApiAdapter());       
}


public Connection getConnection(AccessGrant accessGrant, String providerId){    
            GoogleConnectionFactory connectionFactory = (GoogleConnectionFactory) connectionFactoryLocator.getConnectionFactory(providerId);
            return connectionFactory.createConnection(accessGrant); 
}

public RedirectView getAuthorizeUrl(String providerId, HttpSession session, String returnUrl) {

    String state = UUID.randomUUID().toString();
    session.setAttribute("STATE", state);
    OAuth2Operations oauthOperations = null;
    OAuth2Parameters params = new OAuth2Parameters();
    if(SocialConstants.LINKEDIN_PROVIDER_ID.equals(providerId)){
        LinkedInConnectionFactory connectionFactory = (LinkedInConnectionFactory) connectionFactoryLocator.getConnectionFactory(providerId);
        oauthOperations = connectionFactory.getOAuthOperations();
        params.setRedirectUri(returnUrl);
    }else if(SocialConstants.GOOGLE_PROVIDER_ID.equals(providerId)){
        GoogleConnectionFactory connectionFactory = (GoogleConnectionFactory) connectionFactoryLocator.getConnectionFactory(providerId);
        //ConnectionData cd = new ConnectionData("google", null, null, null, null, "ddd", null, null, null);
        //connectionFactory.createConnection(cd);

        oauthOperations = connectionFactory.getOAuthOperations();
        //params.setScope("profile,email");//profile
        params.setScope("email");
        params.put("prompt", new ArrayList<>(Arrays.asList("consent")));//profile

        params.setRedirectUri(returnUrl);
    }

    params.setState(state);
    String authorizeUrl = oauthOperations.buildAuthorizeUrl(GrantType.AUTHORIZATION_CODE, params);
    return new RedirectView(authorizeUrl);
}
  1. Я должен получить письмо от UserProfile при установлении соединения. Я получаю объект UserProfile, но не всю информацию.

  2. Я получаю правильный URL-адрес от Google для получения данных о человеке

  3. ВозвратURL-адрес также правильный.

...