首页 文章

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

提问于
浏览
8

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

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

{ userFavouriteColour: "Red" }

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

Option 1: Add uid to the ajax request

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

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

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

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

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

In short, I want to know the user's identity on the server but still make requests to the Facebook api from the client browser?

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

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

4 回答

  • 0

    Option 1: 我能想到的最简单的方法是在JS中包含accessToken并使用ajax调用传递它 .

    Option 2: 使用与选项1相同的命令,但不是仅发送accessToken,而是发送signedRequest .

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

    注意: signedRequest 使用应用程序Secret加密 . you are the only one who should know it, so you are safe on that end.

    免责声明:

    我没有C#的编码经验,但谷歌的一点搜索给了我这个:

    Facebook C# SDK for ASP.NET

    Making AJAX Requests with the Facebook C# SDK

  • 0

    实际上它非常简单 .

    当用户加载app时,使用server side authentication,获取访问令牌并通过从服务器发出api请求来加载用户数据 .
    在服务器端,你'll have everything you need and it' s沙盒 .

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

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

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


    编辑

    所有facebook SDK都只是http请求的包装器,因为整个fb api是在http请求上发出的 .
    SDK只是让您轻松,简单地访问数据,而无需自己构建URL(包含所有不同的可能参数),发出请求并解析响应 .

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

    根据我的经验,您的问题的最佳答案是使用服务器端和客户端身份验证,并且由于C#SDK不支持它,我建议您创建自己的SDK .
    它将根据您的需要开发它,它可以根据您的具体需求进行定制,而不像公共SDK那样应该支持所有可能的选项 .


    2编辑

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

  • 3

    我不知道它是否是特定于语言的,但使用服务器端和客户端身份验证都没有坏处 .

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

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

  • 1

    我最近有完全相同的问题 . 这是选项2.检查Facebook博客中的this post .

    说实话,我不足以知道你是否可以欺骗cookie中的UID,但这似乎是“官方”的方式 .

    编辑:对于选项2下的其他问题,是的,我相信您必须在您的域名上访问此cookie .

相关问题