package eu.eudat.security.validators.google; import eu.eudat.dao.entities.UserInfoDao; import eu.eudat.dao.entities.security.CredentialDao; import eu.eudat.dao.entities.security.UserTokenDao; import eu.eudat.entities.Credential; import eu.eudat.entities.UserInfo; import eu.eudat.entities.UserToken; import eu.eudat.exceptions.NonValidTokenException; import eu.eudat.models.criteria.UserInfoCriteria; import eu.eudat.models.security.Principal; import eu.eudat.security.validators.TokenValidator; import eu.eudat.security.validators.TokenValidatorFactoryImpl; import eu.eudat.services.ApiContext; import eu.eudat.services.AuthenticationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.connect.Connection; import org.springframework.social.connect.ConnectionKey; import org.springframework.social.facebook.api.Facebook; import org.springframework.social.facebook.api.User; import org.springframework.social.facebook.connect.FacebookConnectionFactory; import org.springframework.social.facebook.connect.FacebookServiceProvider; import org.springframework.social.oauth2.AccessGrant; import org.springframework.social.oauth2.OAuth2Operations; import org.springframework.stereotype.Component; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.*; /** * Created by ikalyvas on 1/9/2018. */ @Component("facebookTokenValidator") public class FacebookTokenValidator implements TokenValidator { private Environment environment; private ApiContext apiContext; private FacebookServiceProvider facebookServiceProvider; @Autowired public FacebookTokenValidator(Environment environment,ApiContext apiContext) { this.environment = environment; this.apiContext= apiContext; this.facebookServiceProvider = new FacebookServiceProvider(this.environment.getProperty("facebook.login.clientId"), this.environment.getProperty("facebook.login.clientSecret"),this.environment.getProperty("facebook.login.namespace")); } @Override public Principal validateToken(String token) throws NonValidTokenException, IOException, GeneralSecurityException { User profile = getFacebookUserId(token); UserInfoCriteria criteria = new UserInfoCriteria(); criteria.setEmail(profile.getEmail()); List users = apiContext.getDatabaseRepository().getUserInfoDao().getWithCriteria(criteria).toList(); UserInfo userInfo = null; if(users.size()>0)userInfo = users.get(0); final Credential credential = new Credential(); credential.setId(UUID.randomUUID()); credential.setCreationTime(new Date()); credential.setStatus(1); credential.setLastUpdateTime(new Date()); credential.setProvider((int)TokenValidatorFactoryImpl.LoginProvider.FACEBOOK.getValue()); credential.setSecret(token); if(userInfo == null) { userInfo = new UserInfo(); userInfo.setName((String)profile.getName()); userInfo.setVerified_email(profile.isVerified()); userInfo.setEmail(profile.getEmail()); userInfo.setCreated(new Date()); userInfo.setLastloggedin(new Date()); userInfo.setAuthorization_level(new Short("1")); userInfo.setUsertype(new Short("1")); userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); credential.setPublicValue(userInfo.getName()); credential.setUserInfo(userInfo); apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential); } else { userInfo.setLastloggedin(new Date()); Set credentials = userInfo.getCredentials(); if(credentials.contains(credential)){ Credential oldCredential = credentials.stream().filter(item->credential.getProvider().equals(item.getProvider())).findFirst().get(); credential.setId(oldCredential.getId()); } else{ credential.setUserInfo(userInfo); credential.setId(UUID.randomUUID()); credential.setPublicValue(userInfo.getName()); apiContext.getDatabaseRepository().getCredentialDao().createOrUpdate(credential); userInfo.getCredentials().add(credential); } userInfo = apiContext.getDatabaseRepository().getUserInfoDao().createOrUpdate(userInfo); } UserToken userToken = new UserToken(); userToken.setUser(userInfo); userToken.setIssuedAt(new Date()); userToken.setToken(UUID.randomUUID()); userToken.setExpiresAt(addADay(new Date())); apiContext.getDatabaseRepository().getUserTokenDao().create(userToken); return apiContext.getAuthenticationService().Touch(userToken.getToken()); } private User getFacebookUserId(String accessToken) { String [] fields = { "id", "email", "first_name", "last_name","name" }; User profile = this.facebookServiceProvider.getApi(accessToken).fetchObject("me",User.class,fields); return profile; } private Date addADay(Date date){ Date dt = new Date(); Calendar c = Calendar.getInstance(); c.setTime(dt); c.add(Calendar.DATE, 1); dt = c.getTime(); return dt; } }