Login con Facebook

Descripción

¿Quieres hacer login con Facebook en la parte servidor? Solo se necesita un poco de configuración para agilizar los inicio de sesión a tus usuarios. Para el acceso al API de Facebook he usado la siguiente librería java:

<dependency>
	<groupId>org.facebook4j</groupId>
	<artifactId>facebook4j-core</artifactId>
	<version>[2.2,)</version>
</dependency>

Demo 1

Inicio de sesión y redirección a otra página

Facebook Login

Demo 2

Inicio de sesión y recarga de datos en la misma página mediante AJAX

Facebook Login with AJAX response

Códigos fuente

package es.carlosmontero.webapp.t5devutil.pages.javascript;

import java.util.Locale;

import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.annotations.Environmental;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SessionState;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.ThreadLocale;
import org.apache.tapestry5.json.JSONObject;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.ajax.AjaxResponseRenderer;
import org.apache.tapestry5.services.javascript.JavaScriptSupport;
import org.apache.tapestry5.services.javascript.ModuleConfigurationCallback;

import es.carlosmontero.webapp.t5devutil.util.UserSession;

public class FacebookLoginPage {

   @Environmental
   private JavaScriptSupport javaScriptSupport;

   @Inject
   private ThreadLocale threadLocale;

   @Inject
   private PageRenderLinkSource pageRenderLinkSource;

   @Inject
   private AjaxResponseRenderer ajaxResponseRenderer;

   @Inject
   private ComponentResources componentResources;

   @InjectComponent
   private Zone facebookResultZone;

   @SessionState(create = false)
   @Property
   private UserSession userSession;

   public void setupRender() {

      final String facebookLocale;
      if (threadLocale.getLocale().getLanguage().equals(new Locale("es").getLanguage())) {
         facebookLocale = "es_ES";
      }
      else {
         facebookLocale = "en_US";
      }

      javaScriptSupport.addModuleConfigurationCallback(new ModuleConfigurationCallback() {

         @Override
         public JSONObject configure(final JSONObject configuration) {
            final JSONObject facebookExports = new JSONObject();
            facebookExports.put("exports", "FB");
            configuration.getJSONObject("shim").put("facebook", facebookExports);

            final JSONObject facebookPath = new JSONObject();
            facebookPath.put("facebook", "//connect.facebook.net/" + facebookLocale + "/sdk");
            configuration.put("paths", facebookPath);

            return configuration;
         }
      });

      if (userSession == null) {

         final String callback = pageRenderLinkSource.createPageRenderLink(FacebookCallbackPage.class)
                 .toAbsoluteURI();
         final String appId = "132569483831934";

         final String afterLoginFacebookLink = pageRenderLinkSource.createPageRenderLink(FacebookUserPage.class)
                 .toAbsoluteURI();
         javaScriptSupport.require("facebook-login").with(appId, callback,
                 afterLoginFacebookLink, "loginFacebookButton",
                 "none");

         javaScriptSupport.require("facebook-login").with(appId, callback,
                 componentResources.createEventLink("updateUserData").toAbsoluteURI(),
                 "loginFacebookAjaxButton",
                 "facebookResultZone");

      }

   }

   public void onUpdateUserData() {
      ajaxResponseRenderer.addRender(facebookResultZone);
   }

   public void onCloseSession() {

      userSession = null;

   }
}