У меня есть 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);
}
Я должен получить письмо от UserProfile при установлении соединения. Я получаю объект UserProfile, но не всю информацию.
Я получаю правильный URL-адрес от Google для получения данных о человеке
ВозвратURL-адрес также правильный.