8

我有一个 Facebook 画布应用程序。我正在使用 JS SDK 在浏览器端对用户进行身份验证,并通过 FB.api 请求各种信息(例如姓名、朋友等)。

我还想通过 ajax 调用将一些额外的用户信息(不在 Facebook 上)保存到我服务器上的数据库中:

{ userFavouriteColour: "Red" }

要将其保存在服务器上并与正确的用户关联,我需要知道 Facebook uid,这会带来问题。如何将 uid 从客户端传递到服务器。

选项 1:将 uid 添加到 ajax 请求

{ uid: "1234567890",
  userFavouriteColour: "Red" }

这显然不好。任何人使用别人的 Facebook ID 向我的网络服务发出 ajax 请求并更改他们最喜欢的颜色都是微不足道的。

选项 2:在服务器上,从 cookie 中提取 uid:这甚至可能吗?我读到 Facebook 设置了一个包含 uid 和访问令牌的 cookie,但我可以访问我的域上的这个 cookie 吗?更重要的是,我可以安全地从 cookie 中提取 uid,还是像选项 1 一样对欺骗开放。

选项 3:服务器上的用户服务器端身份验证:我可以使用服务器端身份验证来验证服务器上的用户身份。但是,如果我已经在浏览器上使用客户端身份验证,这会起作用吗?我最终会得到两个不同的访问令牌吗?我想从浏览器发出 FB.api 请求,所以我需要客户端上的访问令牌(而不仅仅是服务器上)。

这一定是一个非常常见的场景,所以我认为我缺少一些基本的东西。我已经阅读了很多 Facebook 文档(各种身份验证流程、访问令牌、签名请求等)和许多关于 SO 的帖子,但我仍然不明白客户端身份验证和服务器端身份验证如何很好地结合在一起。

简而言之,我想知道服务器上用户的身份,但仍然从客户端浏览器向 Facebook api 发出请求?

(我在服务器上使用 ASP.NET 和 Facebook C# SDK)

编辑:增加赏金。我希望得到一个关于如何处理这种情况的更权威的官方建议,甚至是一个例子。如前所述,我已经阅读了很多关于身份验证流程的官方 FB 文档,但我仍然找不到任何关于客户端和服务器端身份验证如何协同工作的明确信息。

4

4 回答 4

3

选项1: 我能想到的最简单的方法是在JS中包含accessToken并通过ajax调用传递它。

选项 2: 使用与选项 1 相同的方法,但不是仅发送 accessToken,而是发送 signedRequest。

在服务器端,您可以使用(TryParseSignedRequest方法)对其进行解码,这将为您提供UserID:-)

注意:signedRequest使用应用程序 Secret 加密。你是唯一应该知道的人,所以你在这方面是安全的。

免责声明:

我没有 C# 编码经验,但在 google 中的一些搜索给了我这个:

适用于 ASP.NET 的 Facebook C# SDK

使用 Facebook C# SDK 发出 AJAX 请求

于 2012-05-29T15:48:14.327 回答
1

其实很简单。

当用户加载您的应用程序时,使用服务器端身份验证,获取访问令牌并通过从服务器发出 api 请求来加载用户数据。
在服务器端,您将拥有所需的一切,并且它是沙盒的。

当页面为用户呈现时,使用js sdk获取用户身份验证数据,您应该能够使用FB.getLoginStatus,因为用户已经通过了服务器端身份验证。
现在在客户端,您还有一个访问令牌,您可以使用它从图形 api 获取用户数据。

这两个令牌会有所不同,并且也会有不同的到期时间,但这应该不是问题,两个令牌都应该像您期望的那样正常工作。
由于双方都有自己的令牌和向 api 发出请求的方式,因此无需在它们之间发送任何 fb 数据。

所以你提到的第三个选项,对我来说,听起来是最好的,而且实现起来也很简单。


编辑

所有 facebook SDK 都只是 http 请求的包装器,因为整个 fb api 都是基于 http 请求的。
SDK 只是让您可以轻松、更短地访问数据,而无需自己构建 url(使用所有不同的可能参数)、发出请求并解析响应。

老实说,我认为停止为 C# SDK 提供支持服务器端身份验证的方法是一个非常糟糕的决定。
提供一个不实现整个 api 的 SDK 有什么意义?

根据我的经验,对您的问题的最佳答案是同时使用服务器端和客户端身份验证,并且由于 C# SDK 不支持它,我对您的建议是创建自己的 SDK。
它一点也不复杂,我已经为 python 和 java 实现了它(两次),并且由于您将根据自己的需要开发它,因此它可以根据您的确切需求进行定制,这与应该支持所有可能选项的公共 SDK 不同。


第二次编辑

无需创建全新的 SDK,您只需“扩展”您正在使用的 SDK 并添加您需要的缺失部分,例如服务器端身份验证支持。

于 2012-05-31T10:51:42.720 回答
0

我最近有完全相同的问题。这是选项 2。查看Facebook 博客中的这篇文章。

老实说,我还不足以知道您是否可以在 cookie 中欺骗 UID,但这似乎是“官方”的做法。

编辑:对于选项 2 下的另一个问题,是的,我相信您必须在您的域上访问此 cookie。

于 2012-05-29T15:29:38.330 回答
0

我不知道它是否是特定于语言的,但同时使用服务器端和客户端身份验证并没有什么害处。

您可以使用选项 2,但是是的,这也容易受到欺骗。

执行选项 3,您将拥有该用户会话的单个访问令牌,因此根据我的说法,这将是最佳选择,因为在从客户端传递用户信息时,您总是有机会进行欺骗。

于 2012-05-24T13:12:56.043 回答