SocialAuth execute GraphApi Fql Facebook

Effettuare il  login come indicato qui
Una volta che si ha a disposizione una istanza della classe AuthProvider, per eseguire una query su GraphApi basta richiamare il metodo api(……) della classe su menzionata. Esempio:

AuthProvider provider = manager.connect(SocialAuthUtil.getRequestParametersMap(request));

Response resp = provider.api("https://graph.facebook.com/me", MethodType.GET.toString(), null, null, null); System.out.println("print response:" + resp.getResponseBodyAsString(Constants.ENCODING));

per eseguire direttamente una query Fql basta inserire quest’URL:

https://graph.facebook.com/fql?q=query fql

al posto di

https://graph.facebook.com/me

SocialAuthException – Verification code is null

Eccezione lanciata quando nella request a Facebook manca il token restituito nella response della login.

codice di socialAuth che lancia l’SocialAuthException:


@Override<br />  <span style="color: #7f0055; font-weight: normal;"><b>public</b></span> Profile verifyResponse(<span style="color: #7f0055; font-weight: normal;"><b>final</b></span> HttpServletRequest httpReq)<br />      <span style="color: #7f0055; font-weight: normal;"><b>throws</b></span> Exception {<br />    LOG.info(<span style="color: #2a00ff; font-weight: normal;">"Retrieving Access Token in verify response function"</span>);<br />    <span style="color: #7f0055; font-weight: normal;"><b>if</b></span> (httpReq.getParameter(<span style="color: #2a00ff; font-weight: normal;">"error_reason"</span>) != null<br />        &amp;&amp; <span style="color: #2a00ff; font-weight: normal;">"user_denied"</span>.equals(httpReq.getParameter(<span style="color: #2a00ff; font-weight: normal;">"error_reason"</span>))) {<br />      <span style="color: #7f0055; font-weight: normal;"><b>throw</b></span> <span style="color: #7f0055; font-weight: normal;"><b>new</b></span> UserDeniedPermissionException();<br />    }<br />    <span style="color: #7f0055; font-weight: normal;"><b>if</b></span> (!isProviderState()) {<br />      <span style="color: #7f0055; font-weight: normal;"><b>throw</b></span> <span style="color: #7f0055; font-weight: normal;"><b>new</b></span> ProviderStateException();<br />    }<br />    String code = httpReq.getParameter(<span style="color: #2a00ff; font-weight: normal;">"code"</span>);<br />    <span style="color: #7f0055; font-weight: normal;"><b>if</b></span> (code == null || code.length() == 0) {<br />      <span style="color: #7f0055; font-weight: normal;"><b>throw</b></span> <span style="color: #7f0055; font-weight: normal;"><b>new</b></span> <b>SocialAuthException</b>(<span style="color: #2a00ff; font-weight: normal;">"</span><span style="color: #2a00ff;"><b>Verification code is null</b></span><span style="color: #2a00ff; font-weight: normal;">"</span>);<br />    }

SocialAuth – Login su Facebook con JAVA e JSF

SocialAuth è un framework che permette di interagire con i vari social (Facebook, Twitter, etc) tramite Java.
Vediamo la login.

CREAZIONE APP FACEBOOK
Andare sulla console sviluppatori di facebook, apparirà la seguente schermata:

Nel campo site URL inserire l’indirizzo “http://localhost:8080”, per testare in locale la login.

BEAN
Per creare la connessione verranno usati l’AppId e l’AppSecret, indicati nelle basic info della nostra app su facebook.

package com;

import java.util.Properties;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.brickred.socialauth.Profile;
import org.brickred.socialauth.SocialAuthConfig;
import org.brickred.socialauth.SocialAuthManager;
import org.brickred.socialauth.exception.SocialAuthException;
import org.springframework.stereotype.Component;

@Component
@ManagedBean
@SessionScoped
public class FacebookBean {
private String FACEBOOK_APP_ID = "...............";
private String FACEBOOK_APP_SECRET = ".................";
private SocialAuthManager manager;
private String originalURL;
private String providerID;
private Profile profile;

public void socialConnect() throws Exception {
// Put your keys and secrets from the providers here
Properties props = System.getProperties();
props.put("graph.facebook.com.consumer_key", FACEBOOK_APP_ID);
props.put("graph.facebook.com.consumer_secret", FACEBOOK_APP_SECRET);
// Define your custom permission if needed
props.put("graph.facebook.com.custom_permissions", "publish_stream,email,user_birthday,user_location,offline_access");
// Initiate required components
SocialAuthConfig config = SocialAuthConfig.getDefault();
config.load(props);
manager = new SocialAuthManager();
manager.setSocialAuthConfig(config);
// 'successURL' is the page you'll be redirected to on successful login
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
// String successURL = externalContext.getRequestContextPath() + "socialLoginSuccess.xhtml";
String successURL = "http://localhost:8080/"+ externalContext.getRequestContextPath()+"/socialLoginSuccess.xhtml";
System.out.println("successURL:" + successURL);
String authenticationURL = manager.getAuthenticationUrl("facebook", successURL);
FacesContext.getCurrentInstance().getExternalContext().redirect(authenticationURL);
}

}
Con  la property “graph.facebook.com.custom_permissions” si chiede all’utente il permesso di accedere delle  sue determinate informazioni. In base a quello che si vuole fare c’è bisogno di determinati permessi (o autorizzazioni). Qui una lista completa dei possibili permessi.
Prestare attenzione alla successURL, l’url a cui si viene reindirizzati dopo aver effettuato l’accesso a facebook. Se tale URL non esiste facebook lancerà la seguente eccezione:
{
   "error": {
"message": "redirect_uri isn't an absolute URI. Check RFC 3986.",
"type": "OAuthException",
"code": 191
}
}







N.B. nel log del server apparrà l’errore:

Server returned HTTP response code: 400 for URL:

per capire meglio quale è il vero errore, prendere l’URL e copiarla nel browser.

PAGINA LOGIN E SUCCESS
Nella pagina di login è presente un semplice tasto che richiama l’action su definita

login.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ice="http://www.icesoft.com/icefaces/component"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head />
<h:body>

<h:form>
<h:commandButton value="LOGIN" action="#{facebookBean.socialConnect}" />
</h:form>
</h:body>
</html>

socialLoginSuccess.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Social login success</title>
</h:head>
<h:body>
LOGIN SUCCESS
</h:body>
</html>

ESECUZIONE
Andare sull’url “http://localhost:8080/ProvaJSF/login.jsf”:

cliccando sul tasto LOGIN si viene reindirizzati su facebook che ci chiederà se congediamo i permessi su definiti, una volta cliccato su OK si verrà rimandati nell’URL di success: