package eu.eudat.security.validators.facebook; 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.exceptions.UnauthorisedException; import eu.eudat.models.criteria.UserInfoCriteria; import eu.eudat.models.login.LoginInfo; import eu.eudat.models.loginprovider.LoginProviderUser; 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 AuthenticationService authenticationService; private FacebookServiceProvider facebookServiceProvider; @Autowired public FacebookTokenValidator(Environment environment,ApiContext apiContext,AuthenticationService authenticationService) { this.environment = environment; this.apiContext= apiContext; this.authenticationService = authenticationService; 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(LoginInfo credentials) throws NonValidTokenException, IOException, GeneralSecurityException { User profile = getFacebookUser(credentials.getTicket()); LoginProviderUser user = new LoginProviderUser(); if(profile.getEmail() == null ) throw new UnauthorisedException("Cannot login user.Facebook account did not provide email"); user.setEmail(profile.getEmail()); user.setIsVerified(profile.isVerified()); user.setName(profile.getName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.FACEBOOK); user.setSecret(credentials.getTicket()); return this.authenticationService.Touch(user); } private User getFacebookUser(String accessToken) { String [] fields = { "id", "email", "first_name", "last_name","name","verified" }; 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; } }