package eu.eudat.security.validators.facebook; import eu.eudat.exceptions.security.NonValidTokenException; import eu.eudat.exceptions.security.UnauthorisedException; 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.operations.AuthenticationServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.social.facebook.api.User; import org.springframework.social.facebook.connect.FacebookServiceProvider; import org.springframework.stereotype.Component; import java.io.IOException; import java.security.GeneralSecurityException; import java.util.Calendar; import java.util.Date; @Component("facebookTokenValidator") public class FacebookTokenValidator implements TokenValidator { private Environment environment; private ApiContext apiContext; private AuthenticationServiceImpl authenticationServiceImpl; private FacebookServiceProvider facebookServiceProvider; @Autowired public FacebookTokenValidator(Environment environment, ApiContext apiContext, AuthenticationServiceImpl authenticationServiceImpl) { this.environment = environment; this.apiContext = apiContext; this.authenticationServiceImpl = authenticationServiceImpl; 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.setId(profile.getId()); user.setIsVerified(profile.isVerified()); user.setName(profile.getName()); user.setProvider(TokenValidatorFactoryImpl.LoginProvider.FACEBOOK); user.setSecret(credentials.getTicket()); return this.authenticationServiceImpl.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; } }