package de.tud.kom.socom.web.server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.sql.SQLException; import com.restfb.DefaultFacebookClient; import com.restfb.FacebookClient; import de.tud.kom.socom.web.client.services.social.fb.SocialNetworkService; import de.tud.kom.socom.web.client.sharedmodels.LoginResult; import de.tud.kom.socom.web.server.database.social.HSQLSocialDatabaseAccess; import de.tud.kom.socom.web.server.database.social.SocialDatabaseAccess; import de.tud.kom.socom.web.server.sessions.SessionManager; @SuppressWarnings("serial") public class SocialNetworkServiceImpl extends SoComService implements SocialNetworkService { private static final String FACEBOOK_OAUTH_TOKEN_URL = "https://graph.facebook.com/oauth/access_token"; private static final String FACEBOOK_OAUTH_URL = "https://www.facebook.com/dialog/oauth"; private static final String FACEBOOK_OAUTH_URL_CLIENT_PARAMETER = "client_id"; private static final String FACEBOOK_OAUTH_URL_REDIRECT_PARAMETER = "redirect_uri"; private static final String FACEBOOK_OAUTH_URL_SCOPE_PARAMETER_FULL = "scope=user_about_me,publish_stream,read_stream,offline_access"; private static final String FACEBOOK_OAUTH_URL_STATE_PARAMETER_KEY = "state"; private static final String FACEBOOK_OAUTH_URL_STATE_PARAMETER_VALUE = "gnetworklogin-cb"; private static final String FACEBOOK_OAUTH_URL_STATE_PARAMETER_SEPARATOR = "."; private static final String FACEBOOK_NAME = "facebook"; private static final String FACEBOOK_IDENTIFIER = "fb"; private static final String FACEBOOK_OAUTH_URL_SECRET_PARAMETER = "client_secret"; private static final String FACEBOOK_OAUTH_URL_CODE_PARAMETER = "code"; // private static final String TOKEN_REQUEST_URL = // "https://graph.facebook.com/oauth/access_token?client_id=" + //ResourceLoader.getResource("facebook_app_id") + "&redirect_uri=" // + ResourceLoader.getResource("facebook_redirect_url") + // "&client_secret=" + ResourceLoader.getResource("facebook_app_secret") + "&code="; private SocialDatabaseAccess db = HSQLSocialDatabaseAccess.getInstance(); @Override public LoginResult getFacebookToken(String game, String code) { try { long fbAppId = db.getAppId(FACEBOOK_NAME, game); String fbRedirectUrl = db.getGeneralRedirectUrl(FACEBOOK_NAME, game); String fbappSecret = db.getAppSecret(FACEBOOK_NAME, game); String url_ = FACEBOOK_OAUTH_TOKEN_URL + "?" + FACEBOOK_OAUTH_URL_CLIENT_PARAMETER + "=" + fbAppId + "&" + FACEBOOK_OAUTH_URL_REDIRECT_PARAMETER + "=" + fbRedirectUrl + "&" + FACEBOOK_OAUTH_URL_SECRET_PARAMETER + "=" + fbappSecret + "&" + FACEBOOK_OAUTH_URL_CODE_PARAMETER + "=" + code; URL url = new URL(url_); BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); String answer = reader.readLine(); int endIndex = answer.indexOf("&"); if(endIndex == -1) endIndex = answer.length(); String token = answer.substring(13, endIndex); // "access_token=".length() LoginResult id = getUserFromFacebookUid(token); return id; } catch (IOException e) { logger.Error(e); return new LoginResult(false, false, e.getMessage(), -1); } catch (SQLException e) { e.printStackTrace(); logger.Error(e); return new LoginResult(false, false, e.getMessage(), -1); } } private LoginResult getUserFromFacebookUid(String token) { LoginResult loginResult = null; FacebookClient client = new DefaultFacebookClient(token); com.restfb.types.User user = client.fetchObject("me", com.restfb.types.User.class); String uid = user.getId(); try { loginResult = db.getLoginInformationUsingNetworkId(FACEBOOK_NAME, uid); } catch (SQLException e) { logger.Error(e); return null; } String sid = SessionManager.get().createSession(loginResult); loginResult.setSid(sid); if(loginResult.isSuccess() && (loginResult.isAdmin() || !loginResult.isDeleted())) { logger.Info("Login user #" + loginResult.getUid() + ": " + loginResult.getUsername() + " (Using Facebook ID #" +uid + " in Web-Application)"); } return loginResult; } @Override public String getFacebookLoginUrl(String game) { try { long appid = db.getAppId(FACEBOOK_NAME, game); String redirect_url = db.getGeneralRedirectUrl(FACEBOOK_NAME, game); String url = FACEBOOK_OAUTH_URL + "?" + FACEBOOK_OAUTH_URL_CLIENT_PARAMETER + "=" + appid + "&" + FACEBOOK_OAUTH_URL_REDIRECT_PARAMETER + "=" + redirect_url + "&" + FACEBOOK_OAUTH_URL_SCOPE_PARAMETER_FULL + "&" + FACEBOOK_OAUTH_URL_STATE_PARAMETER_KEY + "=" + FACEBOOK_OAUTH_URL_STATE_PARAMETER_VALUE + FACEBOOK_OAUTH_URL_STATE_PARAMETER_SEPARATOR + FACEBOOK_IDENTIFIER + FACEBOOK_OAUTH_URL_STATE_PARAMETER_SEPARATOR + game; return url; } catch (SQLException e) { logger.Error(e); return null; } } }