领先技术

Facebook 基本编程:身份验证和更新

Dino Esposito

下载代码示例

Dino EspositoFacebook 是一个丰富和复杂的软件平台,其中公开向开发一个复杂和多方面的发展框架­opers。首先,"Facebook 编程"的含义可能并不清楚。有本质上是两种类型的应用程序有关的 Facebook。一种类型包括生存和繁荣在 Facebook 环境内的应用程序。这些应用程序是本质上是丰富的网页在 Facebook 中加载画布页和承载为主的网站。若要使用该应用程序,用户需要导航到 Facebook 网站并登录到他们自己的帐户。这些应用程序可以执行他们自己的逻辑 — —­无论您可以表示从内使用 JavaScript 或其他 Web 编程技术的 Web 页面 — — 并可以访问 Facebook 如朋友、 新闻、 媒体和更多的好东西。若要开始对这种形式的编程,只是转到"Facebook.com 上的应用程序"页 bit.ly/f5hERV

Facebook 编程的另一种方法涉及到将一些核心 Facebook 功能集成到现有的应用程序,如 Web 站点、 手机应用程序 (例如,Android、 iOS 或 Windows Phone) 或桌面应用程序。

在这篇文章我专注于这方面的 Facebook 编程和讨论如何使用 Facebook C# API 来验证用户身份并代表当前登录的用户以编程方式发布。

嵌入的 Like 按钮

当它来到 Facebook 和 Twitter 等热门社交网络时,与外部应用程序集成的第一级是使用特设的按钮,"喜欢"的页或谈论它。几乎没有任何编程是必需的 ; 它是纯粹的 Web 页中插入一些特设的标记。

所以最简单的方法,使您的 Web 站点更受欢迎,是在新的 iframe 中嵌入的 Facebook 类似按钮,以便访问这个页面的任何用户可以立即在 Facebook 上喜欢它。这里是您需要的最小标记:

<iframe src="http://www.facebook.com/plugins/like.php?href=XXX">
</iframe>

你替换的页面的 URL,喜欢 XXX。 此外,可能要添加的 CSS 样式有点到 iframe 元素,使其更好地与页面的其余部分合并。 图 1 显示最终结果。

The Facebook Like Button
图 1 的 Facebook 类似按钮

Like 按钮是最简单 (和最受欢迎) 的 Facebook 社会插件程序。 大多数情况下,您可以在您的网页通过帧或特设的标记集成插件。 某些插件需要 Facebook JavaScript SDK,和一些只工作如果您有自定义的 Facebook 页面。 我将讨论脚本 Facebook 在以后的专栏中。

超出使用社会的插件,整合 Facebook 中的应用程序 (和不只是 Web 站点) 的手段,要能够执行两个主要任务:让用户验证自身身份与您的应用程序使用他们的 Facebook 帐户,和使应用程序发布到特定用户的 Facebook 墙上。 让我们开始与用户身份验证。

OAuth 和单一的身份验证模块的旧梦

用户身份验证是任何重大的 Web 站点的核心功能。 十年前,相比传统的 ASP ASP.NET 的畅销点之一是时间的促进发展的一个身份验证层中通常所需的一小部分的高度可重用的成员资格系统的可用性。

这些天,但是,有一个自定义身份验证层是一个诱人的选项。 通过实施特设身份验证层,开发人员使自己负责安全地存储密码和管理数以千计的帐户或更多的费用。 对于用户来说,这意味着又一次的用户名/密码对,要记住。

年前,微软护照的倡议是一种聪明但可能太早的企图,使用户的生活更容易,当他们跨几个相关站点移动。 护照背后的想法是用户只需要成功登录一次,来自由地浏览所有的相关站点。

与旧版本的 ASP.NET 捆绑在一起,护照 API 是现在正式去了。 然而,它设计来解决,这个问题目前仍然存在。

今天,OpenID (openid.net) 的 Web 站点,需要对其用户进行身份验证,但不是很好的选择想要另一个组的凭据与尚未向他们收取。 OpenID 是一个单一登录 (SSO) 协议,您的站点使用连接到一个第三方服务提供程序将管理您的身份验证。 启用 OpenID 的网站管理只有开头和结尾的验证任务。 它将用户重定向到已配置的 OpenID 提供和获取标识信息,回来时一切都发生了。

OpenID 是一个时髦,而另一个甚至更正在讨论:OAuth (oauth.net)。 两者有何区别?

OpenID 是专门 SSO 协议。 OpenID 提供程序只管理注册用户的身份。 但 Twitter 和 Facebook 等社交网络需要更多。 一个应用程序可能只是想让用户通过 Facebook 进行身份验证。 另一个可能想要通过 Facebook 进行身份验证,但还发布到用户的墙。 然而另一个应用程序可能需要阅读用户的时间线和最近的活动。 最主要的有身份验证 (这可以通过 OpenID 协议管理),但同一用户可能授予不同的权限对不同的应用程序。 这是一个方面,OpenID 不设计给处理。

OAuth 是 Twitter 和 Facebook 使用处理身份验证和授权的协议。 OAuth 提供商不只是返回标识信息。 它要求用户的权限,他想要向应用程序授予和一切、 凭据和成一个访问令牌的权限,然后打包。 客户端应用程序然后将把执行任何允许的操作代表用户的访问令牌。 OAuth (和 OpenID,以及) 的好处之一是提供程序永远不会泄漏到 app 的用户凭据。 此外,当使用 OAuth 时,最终用户将可以撤消权限到任何应用程序在任何时间。 因此,例如,想象一下有些时候您进行身份验证与 app XYZ 使用 Twitter (或 Facebook) 和授予 XYZ 的权限,若要以您的名义发布。 您可以通过简单地转到您的 Twitter (或 Facebook) 配置文件页面吊销此权限的任何时候。 请注意返回的 OAuth 协议的访问令牌是特定于应用程序和用户。 用户将需要登录到多个应用程序如果他打算在多个基于 OAuth 的应用程序上操作。 OAuth 是一种基于 HTTP 的用户进行身份验证协议。 您通常不必写入 HTTP 请求手动,即使你可以 (例如,要了解的东西"下井盖"的工作方式)。 在 Microsoft.NET 框架中,您可以使用通用的库,如 DotNetOpenAuth (dotnetopenauth。 净) 或捡现成的框架,对于一个特定的社会网络,例如 TweetSharp,Twitter 和 Facebook C# SDK。

当到身份验证时,看一看 Windows Azure 访问控制服务。 这可以作为联合的身份提供程序,可以转换多个标识提供程序映射。 它可以承载 OAuth 和从 Active Directory 基于安全断言标记语言的令牌。 也是建立与 Facebook 和.NET 框架中的新的 ClaimsPrincipal 类。

通过 Facebook 的用户进行身份验证

让我们与基本 ASP.NET MVC 站点启动并使用 NuGet 插上 Facebook C# SDK (见图 2)。 ASP.NET MVC 示例站点与一个全新的身份验证控制器富含三种方法,我命名为 FacebookLogin、 FacebookAuthenticated 和注销。 前两种方法表示的两个步骤的 OAuth 互动 ; 注销方法只是日志主机应用程序用户。 请注意,注销行动不应该从 Facebook 用户登录。 OAuth 和 Facebook C# SDK 只管理身份验证逻辑 — — 通过 cookie 保持身份验证信息仍是由 ASP.NET MVC 网站。

Referencing the Facebook C# SDK via NuGet
图 2 引用 NuGet 通过 Facebook C# SDK

该网站的主页提供了用户单击当她想要登录的链接 (请参见图 3)。 该链接可以只是指向上的身份验证控制器 FacebookLogin 行动的图像 (或文本) 到锚点:

<a href="/Auth/Logon" >
  <img src="@Url.Content("~/Content/Images/loginfb.png")"  
    style="border:0" alt="Sign in with FB" />
</a>

The Button to Trigger the Facebook Authentication Process
图 3 按钮来触发 Facebook 身份验证过程

在标准 ASP.NET MVC 网站中,此标记属于 _logOnPartial.cshtml 页。 让我们看一看,身份验证控制器。

FacebookLogin 行动中 — — 是任意的名称 — — 您需要做几件事情。 第一,你安排的 URL,在一次调用从 OAuth 提供程序,将会导致您的应用程序,以完成该身份验证步骤。 在我正考虑的示例应用程序中,URL 将指向的 Auth 控制器上的 FacebookAuthenticated 行动。 您可以使用方便的 UriBuilder 类的这种工作:

var uri = new UriBuilder(Request.Url)
  {
    Path = Url.Action("FacebookAuthenticated", "Auth")
  };

第二件事要做 FacebookLogin 行动中是安排登录 Facebook URL。 如果您使用 Facebook C# SDK,这里是你需要的代码:

var client = new FacebookClient();
var appId = ConfigurationManager.AppSettings["fb_key"];
var returnUri = uri.Uri.AbsoluteUri;
var fbLoginUri = client.GetLoginUrl(new
  {
    client_id = appId,
    redirect_uri = returnUri,
    response_type = "code",
    scope = "email"
  });

您将传递给 GetLoginUrl 方法的参数帮助准备 URL。 图 4 描述的更详细的参数。 通过将用户重定向到的返回的登录 URL FacebookLogin 结束行动。

图 4 登录参数

Parameter 说明
client_id Facebook 的应用程序作为用户 app 和 Facebook 网站之间的代理 ID。 当您注册您的 Facebook 应用程序时,您会得到这唯一的字符串。
redirect_uri 要返回到完整的身份验证 URL (例如,攫取的身份信息和创建身份验证 cookie)。
response_type 这可以是"象征性的"或"代码",它是指 Facebook 如何返回后成功的身份验证的访问令牌。 对于网站来说,它应该是"代码",这样可以确保访问令牌 — — 一块敏感的信息 — — 不追加到 URL。
范围 指示要为用户请求的附加权限。 Scope 参数为空,当应用程序具有访问权限用户的基本信息,如名称、 图片和性别。 通过此参数,您可以请求的电子邮件地址,以及要能发帖子的发布流。 完整的权限列表是可用在 bit.ly/NCcAgf

要通过 Facebook (或 Twitter) 的用户进行身份验证,您需要先注册一个 Facebook (或 Twitter) 的应用程序和为该函数获取一些唯一的代码。 要注册新的 Facebook 应用程序,请转到 bit.ly/mRw8BK。 Facebook 后的 app 的成功创建,给你一个应用程序 ID 字符串和在中所示的页面中显示 app 秘密字符串图 5

Registering a New Facebook App
图 5 注册新的 Facebook 应用程序

执行从一个 Web 站点或任何其他类型的用户应用程序内的 Facebook 操作所需的应用程序 ID 和 app 的秘密。 这是常见的包装应用程序配置文件中存储的应用程序 ID 和 app 的秘密:

<appSettings>
  <add key="fb_key" value="xxxxxxxxxxxx"/>
  <add key="fb_secret" value="yyyyyyyyyyyyyyyyyyyyy"/>
</appSettings>

Facebook 登录 URL 没有它可以对用户进行认证。 尤其是,如果用户当前登录到 Facebook,请求令牌是编写并立即送往指定的返回 URL — — 在这种情况下,这是 FacebookAuthenticated 行动。 如果没有用户当前登录这台机器,Facebook 将显示一个经典的登录页。 在这样做的时候,它还列出了该应用程序正在请求的权限。 以最小权限关切的电子邮件地址和显示名称。 然而,他们可能包括代表用户张贴或访问到的媒体流、 朋友、 时间轴和更多的权限。 明确请用户批准或拒绝这些权限。 完全权限参考信息可在 bit.ly/P86tTC

最后完成身份验证过程

要完成身份验证,您需要请求和解析的访问令牌,如中所示图 6。 方法 ParseOAuth­CallbackUrl 允许您从 Facebook 检索访问代码。 此代码不是不足以控制的 Facebook 帐户 ; 你需要交换它为访问令牌。 根据 OAuth 协议,这就需要另一个步骤和另一个 HTTP 请求。 一旦您的 Web 站点包含给定的用户和一个给定的 Facebook 应用程序的访问令牌,它获得的 Facebook 帐户的权限控制显式授予该用户。 在最起码的时间,您可以检索有关如第一次和最后一名用户的信息,以及如果允许,电子邮件地址的权限。

图 6 最后完成身份验证

public ActionResult FacebookAuthenticated(String returnUrl)
{
  // Prepare the return URL
  var returnUri = new UriBuilder(Request.Url) {
    Path = Url.Action("FacebookAuthenticated", "Auth")
  };
 
  // Parse response to get the access code
  var client = new FacebookClient();
  var oauthResult = client.ParseOAuthCallbackUrl(Request.Url);
 
  // Exchange the code for the access token   
  dynamic result = client.Get("/oauth/access_token",
    new {
      client_id = ConfigurationManager.AppSettings["fb_key"],
      client_secret = ConfigurationManager.AppSettings["fb_secret"],
      redirect_uri = returnUri.Uri.AbsoluteUri,
      code = oauthResult.Code
    });
 
    // Saves the token to a cookie for further access
    var token = result.access_token;
    FbHelpers.AccessTokenSave(Response, token);
 
    // Grab identity information using the access token
    dynamic user = client.Get("/me",
      new {
        fields = "first_name,last_name,email",
          access_token = token
      });
 
    // Create the ASP.NET authentication cookie
    var userName = String.Format("{0} {1}",
      user.first_name, user.last_name);
  FormsAuthentication.SetAuthCookie(userName, false);
 
  // Back home
  return Redirect(returnUrl ?? "
/");
}

如果你唯一的目的通过 Facebook 的用户身份验证,您创建标准 ASP.NET 身份验证 cookie 和完成。 如果您的应用程序想要做更多的 (例如,代表用户发布),则您需要存储的访问令牌,以便能在身份验证 cookie 相同的生存期。 向一个数据库或 cookie,您可以保存的访问令牌。 更重要的是,您可以创建一个自定义的主体和作为 ASP.NET 身份验证 cookie 中的额外的用户数据存储的访问令牌。 只在我的示例应用程序,创建不同的由 FbHelpers 类的附加 cookie (见附带的源代码的详细信息)。

但是,请注意,访问令牌是遵循一些过期的规则。 如果您进行身份验证,使用服务器端代码 (就是发送用户进行身份验证与 Facebook 的站点,如在这里讨论),然后你一个长寿的标记,持续 60 天。 如果您使用 JavaScript SDK 和尝试的客户端身份验证,然后得到一个短命的标记,在两个小时后过期。 您可以通过特定的终结点第二次调用扩展此持续时间为 60 天。 在任何情况下,一旦访问令牌已过期,用户需要再次进行身份验证并重新获取有效的访问令牌。 这里是编码的一个好方法:

try {
  var client = new FacebookClient(...);
  dynamic result = client.Get("me/friends");
} catch (FacebookOAuthException) {
  // Your access token is invalid or expired.
}

整个故事是次在 bit.ly/Qfeh5s

过帐到用户的墙

在 OAuth 方案中,当您将一个用户/应用程序对的访问令牌时你可以以编程方式执行任何授予用户权限的应用程序的交互操作。 若要将邮件张贴到墙上的用户需要下面的代码:

public static void Post(String accessToken, String status)
{
  var client = new FacebookClient(accessToken);
  client.Post("/me/feed", new { message = status });
}

您调用此从内控制器操作方法的帮助器方法。 是否自定义 cookie 中,身份验证 cookie 或持久性存储区的访问令牌字符串必须从您在何处保存它,检索。 如果您丢失的访问令牌,然后开机自检操作成功的用户需要注销并重新登录。 如果你打算执行任务针对 Facebook,生存浏览器重新启动的方式存储的访问令牌是关键。 图 7 显示了示例应用程序发送一条消息,并正确地更新该用户的墙的。

Posting to the Wall
张贴在墙上的图 7

接下来:Windows Presentation Foundation

概括地说,Facebook 公开了相当丰富的 API,通过该开发人员可以将集成 Facebook 的内容和逻辑与他们自己的应用程序。 Facebook app 是 Facebook 的边界内生活的当然嵌入应用程序,但是他们也是经典的 Web 或桌面应用程序外部生活。 在本专栏中我用 Facebook C# SDK 来执行两个简单但很常见操作:使用她的 Facebook 帐户和使用站点的页面发送到当前用户的隔离墙将 Web 站点的用户进行身份验证。 在下一列中,我展开的 Facebook 使用的 Api 集,然后讨论如何实现从 Windows 的演示文稿基础应用程序内的相同操作。

Dino Esposito   "构建移动解决方案的企业"(微软出版社,2012年) 的作者是和"编程 ASP.NET MVC 3"(微软出版社,2011年) 和合著者的"Microsoft.NET:Architecting Applications for the Enterprise》(Microsoft Press,2008 年)的合著者。 Esposito 定居于意大利,经常在世界各地的业内活动中发表演讲。 跟随他在 Twitter 上 twitter.com/despos

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