领先技术

Facebook 基本编程:构建 Windows 客户端

Dino Esposito

下载代码示例

Dino Esposito在我以前的专栏中,我讨论了 Facebook 网站的上下文中的编程的基础知识 — — 具体 ASP.NET MVC Web 站点 (您可以阅读在文章 msdn.microsoft.com/magazine/jj863128)。你可以想象,Facebook API 的使用并不限于 Web 应用程序,即使其最常见的使用只是为了"软性"的方式对新的 Web 站点的用户进行身份验证。

此列中我会建造一个 Windows 演示文稿基金会 (WPF) 客户端应用程序,使用 Facebook API 来验证用户身份并发布带图片的更新。因为 Web 是一个不同的环境,从桌面,此列显然将不同于我所写的最后一个月。Facebook API,但是,是相同的。你可以通过 NuGet Facebook C# SDK (见 facebookapi.codeplex.com 更多详细信息的 Facebook api 的 C# /.NET 开发人员)。

与社交网络的整合应用程序

大多数社交网络都有一个相似的结构。用户和社会网络的引擎之间的相互作用发生在以下两种方法之一:通过主要的 Web 站点 (例如,Twitter 或 Facebook 网站) 直接或通过内部主办的社交网络站点 app 的调解。为清楚起见,我会把这些应用程序称为连接器。

客户端应用程序 (Web 站点、 WPF 或 Windows Phone) 只可以通过连接器的调解的社会网络引擎与交互。伴随此列的示例代码,我将使用 Facebook 连接器称为 (注释的代码,例如提供的目的,是作为一个单一的项目,不是一个完整的解决方案,及使用 Visual Studio 2010),以作留念。名称,以作留念 — — 和其相关的图标 — — 将显示为任何墙员额所作的任何客户端应用程序使用,以作留念连接到 Facebook 的页脚。您可以创建在 facebook 连接器 developers.facebook.com/apps

连接器的特点是一对唯一字符串 — — 应用程序键和秘密 — — 并且,更有趣的是,我们的目的而言,可以为各种客户端应用程序服务,是否 Web、 移动或桌面。图 1 互动的时候,总结了社交网络的总体结构。

The Interaction Model of Social Networks
图 1 社会网络的互动模型

最后,任何用户应用程序需要与最受欢迎的社交网络 (例如,Facebook、 Twitter 或 Foursquare) 集成基本上是作为一个社会网络特定连接器应用程序的客户端生成。

对于 app,基本上与社交网络的整合意味着访问注册用户的社交网络功能。这涉及几个操作:社会网络和执行实际的操作,例如,使签入为一个给定的场地、 用户的墙上张贴或网名对用户进行身份验证。

这是一个社交网络 API 融入一个自定义的应用程序的本质,事实证明,它可能并不局限于只是 Web 应用程序。

Windows 应用程序的差异

在上个月的专栏中,我首先讨论如何通过 Facebook,Web 站点的用户进行身份验证,然后提出了一些代码来张贴两者交互方式和编程方式到该用户的墙。过帐到用户的墙不需要不同办法如果做从 Windows 应用程序 ; 身份验证,相反,需要作出一些调整。

社会网络是主要是 Web 应用程序,并公开通过 OAuth 协议的身份验证服务。想要通过 Facebook 账户,其用户进行身份验证的应用程序,例如需要放置到一些 Facebook 终结点的 HTTP 调用。该终结点,但是,返回实际用户通过输入凭据和授权的连接器,以她的名义运作与交互的 HTML 页 (见图 2)。

The Memento Connector Explicitly Asks the User for Permissions
图 2,以作留念连接器明确要求用户的权限

在 Windows 或移动方案相比,Web 应用程序中是不同的部分是你如何处理重定向到 HTML 页的社会网络提供的凭据和权限。

然而另一个 Facebook Windows 客户端

让我们创建一个 WPF 项目,有点 XAML 标记添加到主窗口。至少,您需要有几个按钮来触发登录和注销过程和一个标签,以显示当前登录的用户的名称。此外,您可以有一个图像元素,以显示当前用户的图片。其他还需要什么?让我们看看你放在登录 click 处理程序中的代码:

var loginUrl = FbHelpers.GetLoginUrl();

第一步从 Facebook 获取的登录 URL。 要获取 URL 的代码是相同,您将在 Web 方案中,使用中所示图 3

图 3 代码来获取登录 URL

public static String GetLoginUrl()
{
  var client = new FacebookClient();
  var fbLoginUri = client.GetLoginUrl(new
  {
    client_id = ConfigurationManager.AppSettings["fb_key"],
    redirect_uri =
    "https://www.facebook.com/connect/login_success.html", 
    response_type = "code",
    display = "popup",
    scope = "email,publish_stream"
  });
  return fbLoginUri.ToString();     
}

你可能注意到,(必需) 的 redirect_uri 参数指向一个 Facebook 成功终结点。 这是的着陆页面后登录进程已终止。 Web 方案中您将使用当前页,因此在用户第一次重定向到 Facebook 网站然后再回原始请求页。

GetLoginUrl 方法只获取您要调用登录的 URL。 在 Web 方案中,您只需调用重定向切换到新的页面并显示典型登录 Facebook 用户界面或 — — 如果用户已经登录使用中的计算机 — — 权限页面中所示图 2。 要达到相同的 Windows 应用程序,您需要在 UI 中的最初隐藏的 WebBrowser 控件。 这里是有关应用程序的登录按钮的 click 处理程序的完整代码:

public void Login()
{
  var loginUrl = FbHelpers.GetLoginUrl();
  ShowBrowser = true;
  view.Browser.Navigate(loginUrl);
}

可供下载的示例应用程序使用模型-视图-(MVVM) 模式来抽象掉 UI 详细信息。 因此,设置 ShowBrowser 为 true,只是有影响的开启 WebBrowser 控件的可见性。 最后,导航方法将定向到指定的 URL 的组件。 图 4 显示示例应用程序的状态,之前和之后单击登录。

First Step of Login to Facebook
图 4 登录 facebook 的第一步

身份验证过程可能会采取两个步骤。 如果用户已经登录到社交网络,在 Web 浏览器直接接收的登录页。 如果用户没有登录中,在所示的页面图 4 提交了。 但是,如果用户没有关联与正在使用的客户端应用程序,然后中间屏幕类似的连接器示图 2 明确要求授予的权限。

你如何处理页 WebBrowser 组件中的负载? 基本上,您需要一个 Navigated 事件处理程序:

void facebookBrowser_Navigated(Object sender, 
  NavigationEventArgs e)
{
  var fb = new FacebookClient();
  FacebookOAuthResult oauthResult;
  if (!fb.TryParseOAuthCallbackUrl(e.Uri, out oauthResult))
    return;
  if (oauthResult.IsSuccess)           
    _viewPresenter.LoginSucceeded(oauthResult);           
  else           
    _viewPresenter.LoginFailed(oauthResult);
}

Facebook 指示成功或不是否完成登录过程。 请注意,登录失败,如果用户只需到连接器拒绝请求的权限。 如果登录失败,只是重置隐藏在 Web 浏览器的用户界面,并向用户显示一些反馈。 当登录成功,如中所示的更有趣的是图 5

图 5 登录成功时

public void LoginSucceeded(FacebookOAuthResult oauthResult)
{
  // Hide the Web browser
  ShowBrowser = false;
  // Grab the access token (necessary for further operations)
  var token = FbHelpers.GetAccessToken(oauthResult);
  Token = token;
  // Grab user information
  dynamic user = FbHelpers.GetUser(token);
  // Update the user interface
  UserName = String.Format("{0} {1}", user.first_name,
    user.last_name);
  UserPicture = user.picture;
  IsLogged = true;
}

中的代码图 5 类似于您需要在 Web 方案中使用。 请注意一旦用户已成功登录,app 是仍尚未准备代表用户操作。 此外,该应用程序尚未不知道任何与用户有关的 — — 甚至没有用户名称或某种类型的 id。 这意味着保留身份验证数据尚不可能。 因此,另一个步骤是强制性的 Web 和 Windows 的方案:获取访问令牌。

访问令牌

访问令牌是你从社会网络获得成功登录代码的字符串。 登录代码只是指示进行身份验证的用户了解到网络。 访问代码联结在一起的用户标识和连接器。 访问代码告诉社会网络引擎用户应用程序是否具有足够的权限执行代表该用户所请求的操作。 同一用户不同连接器有一个不同的访问令牌。

图 6 OAuth 登录成功后显示的 C# 代码来获取访问令牌。

图 6 代码来获取成功的 OAuth 登录后的访问令牌

public static String GetAccessToken(FacebookOAuthResult oauthResult)
{
  var client = new FacebookClient();
  dynamic result = client.Get("/oauth/access_token",
    new
    {
      client_id = ConfigurationManager.AppSettings["fb_key"],
      client_secret =
      ConfigurationManager.AppSettings["fb_secret"],
      redirect_uri =
      "https://www.facebook.../login_success.html", 
      code = oauthResult.Code
  });
  return result.access_token;
}

在 Web 应用程序中,您可能想要坚持在自定义 cookie 或作为自定义 IPrincipal 对象所管理的自定义身份验证 cookie 中的额外数据的访问令牌。 在 Windows 的情况下,您可能想要诉诸本地存储。 当该用户注销 Windows 应用程序时,您只需清除出任何存储的数据。 一旦你持有一个给定的用户和连接器的访问令牌,您已经准备好执行的任何操作都属于授予的权限,如中所示图 2

常见的社交网络应用程序类型"侦听"到一些饲料,和代表相同的用户自动员额。 在这种情况下,你一次抓的访问令牌并保持上运行应用程序,直到用户撤消的权限。 一旦你持有的访问令牌,您不需要处理的身份验证,只要用户令牌的背后其实登录到计算机的社会网络。

过帐状态和照片

图 7 显示示例 WPF 应用程序的 UI,一旦用户成功登录到 Facebook 和安全地存储的访问令牌。 用户界面包括一个文本框和一个按钮,用于发布。 正如您所看到的 UI 还定义了一个按钮,用于浏览和从本地磁盘中选择 JPEG 图像。

Posting from the Sample Client App
图 7 示例客户端应用程序从过帐

中的代码图 8 演示如何发布更新与附加的图片。

图 8 中的代码以发布与附加的图片更新

public static void PostWithPhoto(
  String token, String status, String photoPath)
{
  var client = new FacebookClient(token);
  using (var stream = File.OpenRead(photoPath))
  {
    client.Post("me/photos",
    new
    {
      message = status,
       file = new FacebookMediaStream
  {
         ContentType = "image/jpg",
         FileName = Path.GetFileName(photoPath)
        }.SetValue(stream)
    });
  }
}

图 7 你看到的更新和过帐到时间线的图片。 请注意使用的连接器的名称提出根据作者的姓名。

接下来:JavaScript

在这篇文章我构建了一个 WPF 应用程序发布到 Facebook 用户。 若要生成一个手机应用程序,你遵循同一模式在这里讨论了。 请注意该模式是有效选择的移动平台无关。 我已经在这同一种方式成功地构建 Windows Phone 和 Android 应用程序。 我的下一列将显示如何使用 JavaScript 程序 Facebook。

Dino Esposito是《Architecting Mobile Solutions for the Enterprise》(Microsoft Press,2012 年)和《Programming ASP.NET MVC 3》(Microsoft Press,2011 年)的作者,同时也是《Microsoft .NET:Architecting Applications for the Enterprise》(Microsoft Press,2008 年)的合著者。Esposito 定居于意大利,经常在世界各地的业内活动中发表演讲。有关他的情况,请访问 Twitter twitter.com/despos

衷心感谢以下技术专家对本文的审阅:斯科特 · 登斯莫尔