如何安全地将Facebook Id从客户端传递到服务器

njr*_*101 8 authentication facebook facebook-c#-sdk

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

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

{ userFavouriteColour: "Red" }
Run Code Online (Sandbox Code Playgroud)

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

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

{ uid: "1234567890",
  userFavouriteColour: "Red" }
Run Code Online (Sandbox Code Playgroud)

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

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

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

这必须是一个非常常见的场景,所以我想我缺少一些基本的东西.我已经阅读了很多Facebook文档(各种身份验证流程,访问令牌,signed_request等)和SO上的很多帖子,但我仍然不明白客户端身份验证和服务器端身份验证如何很好地协同工作.

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

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

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

Ron*_*oni 3

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

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

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

注意:signedRequest使用应用程序 Secret 进行加密。您是唯一应该知道这一点的人,因此您是安全的。

免责声明:

我没有 C# 编码经验,但在 google 中进行了一些搜索,得到了以下结果:

用于 ASP.NET 的 Facebook C# SDK

使用 Facebook C# SDK 发出 AJAX 请求