Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
授权后将数据传回facebook应用程序_Facebook_Node.js_Facebook Graph Api_Express - Fatal编程技术网

授权后将数据传回facebook应用程序

授权后将数据传回facebook应用程序,facebook,node.js,facebook-graph-api,express,Facebook,Node.js,Facebook Graph Api,Express,我正在以以下方式授权我的应用程序: // authorize app! $('#authApp').click(function(){ var oauth_url = 'https://www.facebook.com/dialog/oauth/'; oauth_url += '?client_id=#{app.id}'; oauth_url +

我正在以以下方式授权我的应用程序:

// authorize app!
                $('#authApp').click(function(){
                    var oauth_url = 'https://www.facebook.com/dialog/oauth/';
                    oauth_url += '?client_id=#{app.id}';
                    oauth_url += '&redirect_uri=' + encodeURIComponent('https://www.facebook.com/pages/null/#{fbPageId()}/?sk=app_#{app.id}');
                    oauth_url += '&scope=user_likes,user_photos';
                    oauth_url += '&app_data=7B%27game%27%3A+%27key%27%7D';
                    oauth_url += '&state=sbSbsbSb';
如您所见,我正在将“state”参数设置为查询字符串的一部分。 现在,当用户授权应用程序时,他将被重定向到重定向url

但是,在state参数中传递的数据不会发布到我的应用程序,也不是我的应用程序的iframe查询字符串的一部分。我本来希望找到它作为签名请求的一部分,但是没有。这是授权后发布的反序列化签名请求

{ algorithm: 'HMAC-SHA256',
  expires: 1348927200,
  issued_at: 1348921162,
  oauth_token: 'AAA...',
  page: { id: '490...', liked: true, admin: false },
  user: { country: 'ec', locale: 'en_US', age: { min: 21 } },
  user_id: '1...' }
我确实看到状态包含在父页面的查询字符串中。我需要从我的应用程序(在iframe中运行)访问该参数。我相信,由于同源策略的限制,我不能只访问父页面的窗口位置

我已经阅读了文档并在网上搜索了。跨应用程序身份验证持久化数据需要使用state参数完成。然而,它并没有说明如何检索状态参数一旦重定向回您的应用程序

这是关于状态参数的源代码:

用于在请求之间维护应用程序状态的唯一字符串 和回拨。当Facebook将用户重定向回您的 重定向_uri,此参数的值将包含在响应中。 您应该使用它来防止跨站点请求伪造

我应该从父级的页面查询字符串获取状态数据吗? 还是我做错了什么

*编辑* 我正在状态参数中存储用户到用户请求Id。例如,A通过facebook请求邀请B参与应用程序。一旦B授权应用,A需要得到奖励。所以我需要知道B是在A的邀请下来到应用程序的。因此,我将requestId存储在state参数中,这样一旦B授权了应用程序,我就可以采取适当的操作

*编辑2(解决方案)** 如果您的重定向uri指向页面选项卡URL,则facebook不会发回状态参数!只有当你重定向到画布URL时,它才会被发回

我应该从父级的页面查询字符串获取状态数据吗

否,在画布/页面选项卡应用程序中进行身份验证时不会。在此场景中,传递给应用程序的唯一查询字符串参数是
app\u数据的内容

但在这种情况下,您不需要使用
state
参数–验证
signed_请求
是绝对足够的,因为它是用您的应用程序机密签名的,只有您和Facebook知道。因此,这已经足够防止“被操纵”的请求了

见resp。更多细节。(看看他们怎么一点也不提到
状态
参数。)

编辑:

我正在状态参数中存储用户到用户请求Id。例如,A通过facebook请求邀请B参与应用程序。一旦B授权应用,A需要得到奖励。所以我需要知道B是在A的邀请下来到应用程序的。因此,我将requestId存储在state参数中,这样一旦B授权了应用程序,我就可以采取适当的操作

这是对
state
参数的误用……它应该实现完全不同的功能(如文档所述,CSRF保护)


虽然这在您的场景中可能有效–为什么不使用
app\u data
参数来传输此信息?这是将信息传输到画布/页面选项卡应用程序的指定方式。

您引用的Facebook文档有点混乱。对于state参数,您应该做的唯一一件事是确保您不是CSRF的受害者。给出了一个PHP中的示例。简而言之,您应该在会话中存储状态值,然后验证会话值是否与Facebook在请求中传递给您的值相同。他们的PHP示例中的关键行是:

if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['state'])) {
   // Continue with application logic here because state matches.
   // Otherwise, exit immediately because you're a victim of CSRF!
回到你的问题上来。从你的重定向URL和你得到的回复来看,很明显你的应用程序在Facebook页面标签上。请参阅,了解您应该如何执行此操作。请注意,他们在步骤2中没有使用state参数,并且在页面选项卡身份验证流中从未提到state参数。因此,即使您想将state参数用于其预期用途之外的其他用途,您也是运气不佳


根据您的编辑,我建议您查看。请注意,用户单击请求将被重定向到您的画布应用程序,而不是页面选项卡。“画布URL还将包含一个附加的GET参数request_ID,这是一个以逗号分隔的列表,由用户试图执行操作的请求ID分隔的列表。”因此,您无需自己尝试执行此操作。

查看问题中的编辑。它解释了状态参数的需要。我存储的实际上是用户对用户的请求ID。除了对您的问题没有实际可见的编辑之外,我猜您指的是Oauth对话框文档中的引用。正如我之前所说的,托德再次指出——在这种情况下不需要这种保护,因为
signed_请求
已经在这里提供了必要的安全级别——对于非真实的请求,没有(现实的)伪造签名的方法。哇,太快了!你一定是在我编辑问题的时候访问过我。我确实在编辑之前回复了你,这是我回复你之后立即回复的。我需要删除请求ID。但由于用户尚未授权该应用程序,因此当用户登录到我的画布页面时,我没有必要的权限删除它们。因此,在用户授权我的应用程序后,我使用状态参数访问请求ID,我最终可以删除它们。“我需要删除请求ID”-您不需要用户访问令牌,您可以