// Rodolfo Fadino

/* LIFE RUNS ON CODE */

A integração com as redes sociais é sem dúvida nenhuma um excelente recurso para trazer usuários, divulgar a aplicação e transformar nossas aplicações em uma extensão das redes sociais.

O Facebook é uma destas redes, ele possui diversas funcionalidades em suas APIs, elas são expostas através de Rest, ou seja, com simples WebRequest’s é possivel acessar e fazer uso de toda a api.

Entretanto exitem diversos SDK’s que faciliam o uso da api, no caso da API do Facebook um dos pincipais projetos de SDK está no Codeplex, o Facebook C# SDK possui diversas funções e recursos para facilitar a integração.

Principais recursos:

  • NuGet Packages
  • Compatibilidade com toda a API REST e Graph do Facebook
  • Suporta os métodos de autenticação do Facebook
  • Compatível com o SDK JavaScript oficial do Facebook

Começando:
Para começar a testar o SDK vou criar um projeto em ASP.NET MVC 3.0

Selecionei um projeto com o Template de Internet Aplication, utilizando Razor como View engine:

Instalando:

Eu poderia baixar a DLL do projeto do codeplex, mais eu optei por instalar o SDK via Nuget, para isso abii o Package Manager Console, e digitei o segunte comando:

Install-Package FacebookWebMVC

 

 

Apos isso, já podemos observar algumas bibliotecas referenciadas no projeto:

  • Facebook
  • Facebook.Web
  • Facebook.Web.Mvc

Programando

Vou criar uma aplicação no Facebook (http://developers.facebook.com/)

 

 

Nos utilizaremos esta aplicação para integrar e consultar os dados dos usuários via API. para isso precisaremos configurar a url do WebSite de nossa aplicação no Facebook, inicialmente eu configurei com o valor: http://localhost:2723/

 

O próximo passo será configurar os valores do web.config de nossa aplicação, que após a intalação do packge apresentou uma seção da seguinte maneira:

 

 

Essa seção conta com duas propriedades principais que devem ser preenchidas. a AppID e a AppSecret do Facebook, que eu preenchi com os valores do Aplicativo que eu criei no Facebook:

 

 

Já podemos começar a desenvolver a lógica da nossa aplicação.

No Home Controller, irei deixa-lo com 3 Actions Result:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult MensagemPost(string message)
    {
        return RedirectToAction("Index", new { success = true });
    }

    public ActionResult LogOn(string returnUrl)
    {
        return View();
    }

}

Vamos utilizar um dos recursos desse SDK, a possibilidade de decorar uma Action com o FacebookAuthorize, para isso criei uma propriedade com as permissões que queremos em nossa aplicação e decorei duas Actions para utiliza-la:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Facebook.Web.Mvc;
using Facebook.Web;
using Facebook;
using System.Dynamic;

namespace DemoFacebook.MVC.SDK.Controllers
{
    public class HomeController : Controller
    {
        private const string ExtendedPermissions = "user_about_me,publish_stream";

        [FacebookAuthorize(Permissions = ExtendedPermissions, LoginUrl = "/Home/LogOn?ReturnUrl=~/Home")]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        [FacebookAuthorize(Permissions = ExtendedPermissions, LoginUrl = "/Home/LogOn?ReturnUrl=~/Home")]
        public ActionResult MensagemPost(string message)
        {
            return RedirectToAction("Index", new { success = true });
        }

        public ActionResult LogOn(string returnUrl)
        {
            return View();
        }

    }
}

Precisamos desenvolver a parte de login da aplicação para isso vamos programar na Action LogOn:

public ActionResult LogOn(string returnUrl)
{
    var fbWebContext = new FacebookWebContext(FacebookApplication.Current, ControllerContext.HttpContext);

    if (fbWebContext.IsAuthorized(ExtendedPermissions.Split(',')))
    {
        if (!string.IsNullOrWhiteSpace(returnUrl))
        {
            if (Url.IsLocalUrl(returnUrl))
            {
                return new RedirectResult(returnUrl);
            }
        }

        return RedirectToAction("Index", "Home");
    }

    ViewBag.ExtendedPermissions = ExtendedPermissions;
    return View();
}

Vamos adicionar a View LogOn.cshtml, na pasta /Views/Home/ e nela utilizar a biblotica js do Facebook para abrir o modal de login:

@{
    ViewBag.Title = "LogOn";
}

<h2>LogOn</h2>

<input type="button" id="fblogin"  value="Login to Facebook" disabled="disabled"/>

<div id="fb-root"></div>
<script>
    window.fbAsyncInit = function () {
        FB.init({
            appId: '@Facebook.FacebookApplication.Current.AppId',
            channelURL: '@Request.Url.Scheme://@Request.Url.Authority@Url.Content("~/fbchannel.ashx")', // Channel File
            cookie: true,
            xfbml: true,
            oauth: true
        });

        // #region Login to Facebook using FB.login() method
        function facebooklogin() {
            FB.login(function (response) {
                if (response.authResponse) {
                    // user authorized
                    window.location.reload();
                } else {
                    // user cancelled
                }
            }, { scope: '@ViewBag.ExtendedPermissions' });
        };

        $(function () {
            // make the button is only enabled after the facebook js sdk has been loaded.
            $('#fblogin').attr('disabled', false).click(facebooklogin);
        });
        // #endregion

        // #region Login using Facebook Login Button plugin
        FB.Event.subscribe('auth.login', function (response) {
            window.location.reload();
        });
        FB.Event.subscribe('auth.logout', function (response) {
            window.location.reload();
        });
        // #endregion
    };

    // Load the Facebook JS SDK Asynchronously
    (function (d) {
        var js, id = 'facebook-jssdk'; if (d.getElementById(id)) { return; }
        js = d.createElement('script'); js.id = id; js.async = true;
        js.src = "//connect.facebook.net/en_US/all.js";
        d.getElementsByTagName('head')[0].appendChild(js);
    } (document));
</script>

 

Com isso já temos o login de nossa aplicação funcionando, entretanto como estamos em um ambiente de desenvolvimento podem ocorrer alguns problemas ao fazer login em certos navegadores, pois estamos utilizando como url da nossa aplicação o http://localhost:2723/. Ex de erro:

 

 

Para resolver isso configurei o dominio app.dominioteste.com (Linha 20)  no arquivo hosts da minha maquina, que fica geralmente no C:\Windows\System32\drivers\etc\hosts

 

 

Após esta configuração eu criei um website no IIS na porta 80 que responde por: app.dominioteste.com

 

 

Após isso eu configurei minha aplicação no Facebook com esse dominio:

 

 

O último passo que tive que fazer para isso funcionar foi configurar meu projeto (no Visual Studio 2010)  para executar no IIS:

 

Pronto :) nosso projeto está acessível e não teremos problemas com a url de autenticação.

 

Para finalizar vamos desenvolver o que será o funcionamento de nossa aplicação: trazer dados do usuário e postar uma mensagem.

Na Action Index vamos trazer os dados do usuário que está autenticado:

[FacebookAuthorize(Permissions = ExtendedPermissions, LoginUrl = "/Home/LogOn?ReturnUrl=~/Home")]
public ActionResult Index()
{
    var fb = new FacebookWebClient();
    dynamic me = fb.Get("me");

    ViewBag.ProfilePictureUrl = string.Format("http://graph.facebok.com/{0}/picture", me.id);
    ViewBag.Name = me.name;
    ViewBag.FirstName = me.first_name;
    ViewBag.LastName = me.last_name;

    ViewBag.MessagePostSuccess = Request.QueryString.AllKeys.Contains("success") &&
                                    Request.QueryString["success"] == "True";

    return View();
}

Agora na Action MensagemPost vamos postar um mensagem no wall do usuário

[HttpPost]
[FacebookAuthorize(Permissions = ExtendedPermissions, LoginUrl = "/Home/LogOn?ReturnUrl=~/Home")]
public ActionResult MensagemPost(string message)
{
    var fb = new FacebookWebClient();

    dynamic parameters = new ExpandoObject();
    parameters.message = message;

    dynamic result = fb.Post("me/feed", parameters);

    return RedirectToAction("Index", new { success = true });
}

Finalmente vamos desenvolver a View Index.cshtml que exibirá os dados do usuário e terá um formulário para postar a mensagem no Facebook.

@{
    ViewBag.Title = "Home Page";
}

<strong>@ViewBag.Name</strong>

<br/>

<img src="@ViewBag.ProfilePictureUrl"/>

<table>
    <tr>
        <td>Nome:</td>
        <td>@ViewBag.FirstName</td>
    </tr>
    <tr>
        <td>Sobrenome:</td>
        <td>@ViewBag.LastName</td>
    </tr>
</table>

<br/>

@using (Html.BeginForm("MensagemPost", "Home"))
{
    <label for="message">Mensagem</label><br/>
    <textarea id="message" name="message" style="width: 300px; height:100px;"></textarea><br/>
    <input type="submit" value="Post To Wall"/>
}

@if (ViewBag.MessagePostSuccess) {
    <div>Mensagem enviada com sucesso.</div>
}

 

Com tudo isso nos já temos nossa aplicação funcionando :)

as demos podem ser encontradas em:

Download: https://github.com/rodolfofadino/FacebookDemo/zipball/master

Projeto: https://github.com/rodolfofadino/FacebookDemo

 

Espero que este post seja útil,

estou a disposição para dúvidas, críticas e sugestões

tks

Rodolfo

ASP.NET

Existem diversos SDK’s que facilitam a integração com a API do Facebook, para .NET um dos mais completos é o Facebook C# SDK, que está disponível no Codeplex, este SDK possui diversos recursos, como controles ASP.NET WebForms, MVC e diversas outras funções. Entretando, toda a API do Facebook é exposta por protocolos HTTP, sendo possivel utilizar todas suas funções com simples requisições utilizando o WebRequest. Neste post irei demonstrar como criar uma classe para autenticar, ler e postar informações no Facebook.

Começando

Para começar eu criei dois projetos, sendo um Class Library e um WebSite com ASP.NET WebForms:

 

Agora, vamos começar a desenvolver a classe que acessará a API do Facebook, para isso eu criei uma classe chamada AuthFacebook:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Net;

namespace DemoFacebook.BL
{
    public class AuthFacebook
    {
        public enum Method { GET, POST };
        public const string Authorize = "";
        public const string Access_Token = "";
        public string CallBack_Url = "";

        private string _aplicationKey="";
        private string _aplicationSecret = "";
        private string _token = "";

        public string AplicationKey{ get; set; }

        public string AplicationSecret { get; set; }

        public string Token{ get; set; }

        public string GetAuthorizationLink()
        {
            return "";
        }

        public string GetAuthorizationLinkPopup()
        {
            return "";
        }

        public void GetAccessToken(string authToken)
        {

        }

        public string Request(Method method, string url, string postData)
        {
            return "";
        }

        public  string GetWebResponse(HttpWebRequest webRequest)
        {
            return "";
        }
    }
}

Nela eu configurei as propriedades de Secret e Key da aplicação

public enum Method { GET, POST };
public const string Authorize = "https://graph.facebook.com/oauth/authorize";
public const string Access_Token = "https://graph.facebook.com/oauth/access_token";
public string CallBack_Url = "";

private string _aplicationKey="";
private string _aplicationSecret = "";
private string _token = "";

public string AplicationKey
{
    get
    {
        if (_aplicationKey.Length == 0)
        {
            _aplicationKey = ConfigurationManager.AppSettings["Facebook_aplicationKey"];
        }
        return _aplicationKey;
    }
    set { _aplicationKey = value; }
}

public string AplicationSecret
{
    get
    {
        if (_aplicationSecret.Length == 0)
        {
            _aplicationSecret = ConfigurationManager.AppSettings["Facebook_aplicationSecret"];
        }
        return _aplicationSecret;
    }
    set { _aplicationSecret = value; }
}

public string Token{ get; set; }

Nosso próximo passo será programar os dois métodos que retornarão as urls de autenticação:

public string GetAuthorizationLink()
{
    return string.Format("{0}?client_id={1}&redirect_uri={2}&scope={3}",
        Authorize, AplicationKey, CallBack_Url, "publish_stream");
}

public string GetAuthorizationLinkPopup()
{
    return string.Format("{0}?client_id={1}&display=popup&redirect_uri={2}&scope={3}",
        Authorize, AplicationKey, CallBack_Url, "publish_stream");
}

Agora vamos desenvolver o método que utilizará o authToken para requisitar o Token de acesso, um token que poderemos utilizar em definitivo nas nossa aplicação para o determinado usuário:

public void GetAccessToken(string authToken)
{
    this.Token = authToken;
    string accessTokenUrl = string.Format("{0}?client_id={1}&redirect_uri={2}&client_secret={3}&code={4}",
    Access_Token, this.AplicationKey, CallBack_Url, this.AplicationSecret, authToken);

    string response = Request(Method.GET, accessTokenUrl, String.Empty);

    if (response.Length > 0)
    {
        NameValueCollection qs = HttpUtility.ParseQueryString(response);

        if (qs["access_token"] != null)
        {
            this.Token = qs["access_token"];
        }
    }
}

Finalmente vamos desenvolver os últimos dois métodos, eles serão responsáveis por fazer e montar as requisições:

public string Request(Method method, string url, string postData)
{
    HttpWebRequest webRequest = null;
    StreamWriter requestWriter = null;
    string responseData = "";

    webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
    webRequest.Method = method.ToString();
    webRequest.ServicePoint.Expect100Continue = false;
    webRequest.UserAgent = "[Seu user agent]";
    webRequest.Timeout = 20000;

    if (method == Method.POST)
    {
        webRequest.ContentType = "application/x-www-form-urlencoded";

        //POST the data.
        requestWriter = new StreamWriter(webRequest.GetRequestStream());

        try
        {
            requestWriter.Write(postData);
        }
        catch
        {
            throw;
        }
        finally
        {
            requestWriter.Close();
            requestWriter = null;
        }
    }

    responseData = GetWebResponse(webRequest);
    webRequest = null;
    return responseData;
}

public string GetWebResponse(HttpWebRequest webRequest)
{
    StreamReader responseReader = null;
    string responseData = "";

    try
    {
        responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
        responseData = responseReader.ReadToEnd();
    }
    catch
    {
        throw;
    }
    finally
    {
        webRequest.GetResponse().GetResponseStream().Close();
        responseReader.Close();
        responseReader = null;
    }

    return responseData;
}

Chegou a hora de usar nossa classe :) para isso eu vou configurar a aplicação que eu criei no Facebook  (http://developers.facebook.com/)

 

Também irei configurar a Key e o Secret no Web.Config da aplicação:

<appSettings>
  <add key="Facebook_aplicationKey" value="238348076215393"/>
  <add key="Facebook_aplicationSecret" value="c3dddef5412fa014d2832f619e66a845"/>
</appSettings>

Com isso já podemos utilizar nossa classe, criei duas páginas, a Default.aspx e a CallbackFacebook.aspx que será a onde teremos o retorno da autenticação com o Facebook.

Na página CallbackFacebook.aspx eu programei o seguinte:

protected void Page_Load(object sender, EventArgs e)
{
    string url = "";
    AuthFacebook oAuth = new AuthFacebook();
    oAuth.CallBack_Url = "http://localhost:1789/CallbackFacebook.aspx";

    if (Request["code"] == null)
    {
        Response.Redirect(oAuth.GetAuthorizationLink());
    }
    else
    {
        oAuth.GetAccessToken(Request["code"]);

        if (oAuth.Token.Length > 0)
        {
            Session["token"] = oAuth.Token;
            Response.Redirect("~/Default.aspx");
        }
    }
}

Veja que eu “Guardei” o token do usuário em uma Session apenas a titulo de exemplo, sendo que o ideal é guarda-lo em um banco de dados.

Agora eu recupero esse token na Defout.aspx e faço uma requisição a qualquer url da api, o que me retornará um json com o resultado:

protected void Page_Load(object sender, EventArgs e)
{
    AuthFacebook oAuth = new AuthFacebook();
    oAuth.CallBack_Url = "http://localhost:1789/CallbackFacebook.aspx";

    if(Session["token"] ==null)
    {
        Response.Redirect(oAuth.GetAuthorizationLink());
    }
    else
    {
        oAuth.Token = Session["token"].ToString();

        var url = "https://graph.facebook.com/me?access_token=" + oAuth.Token;
        string json = oAuth.Request(AuthFacebook.Method.GET, url, String.Empty);
        ltrJson.Text = json;
    }
}

Lembrando que poderiamos fazer qualquer tipo de requisição, inclusive enviar e postar mensagens para o usuário.

Como exemplo eu retornei os dados do perfil do usuário:

O projto de demo está disponivel no meu github:

https://github.com/rodolfofadino/FacebookDemo

Espero que este post seja útil,

estou a disposição para dúvidas, criticas ou sugestões

abs

Rodolfo

 

 

ASP.NET