【问题标题】:Finding current page from page tab using js使用js从页面选项卡中查找当前页面
【发布时间】:2012-03-18 12:42:52
【问题描述】:

我有一个 Facebook 应用程序,在许多页面上都安装了一个页面选项卡。

我知道我可以解析服务器端、signed_request 并在页面上拥有我需要的所有数据、当前用户等。

但是,我只需要知道页面 ID,甚至页面 URL,使用客户端 JS(因此,无法访问通过 POST 发送的 signed_request,没有 PHP 或其他服务器端语言)。

有没有办法单独获取这些信息?即使未签名且不安全?


我真的很想知道在设置服务器端进程之前是否有可能,但是即使答案是“不,你不能这样做”,请给出一些动机,说明为什么唯一的方法是知道当前页面应该是服务器端脚本,如果 Facebook 提供一种以不安全的方式了解当前页面的方法,可能会出现什么安全违规行为。

【问题讨论】:

  • 我尝试使用document.referrer,但是由于Facebok使用代理PHP来加载iframe,所以这不是获取当前页面URL的方法。
  • 在您的场景中,您无法访问 php 或其他服务器端语言吗?您可以将signed_request 输出为javascript 变量吗?或者这是不可行的?我知道你说你想要一个仅限 JS 的解决方案,我只是不知道为什么。如果您能以某种方式将signed_request 输出到javascript,那么您可以继续在javascript 中进行解析。
  • Simone,并不是说它是安全的。只是facebook没有以任何其他方式提供页面ID。这就是为什么没有办法解决它。您仍然可以使用 CDN 来提供页面选项卡,您只需要一个带有某种 php(或其他后端语言)的页面来捕获页面 id,然后将其转发到您的 CDN。
  • 如果那是您的不二之选,那么您只需向 developers.facebook.com/bugs 提交功能请求即可。
  • @CoderFromOuterSpace 归档,谢谢。

标签: javascript facebook-page


【解决方案1】:

使用window.top.location 可以获得页面标签的完整URL。然后,您可以从那里解析 ID!

【讨论】:

  • 不幸的是:因为 window.top 来自 www.facebook.com 域,而我的 iframe 来自我的域,浏览器不允许 mw 读取 window.top.location。它会引发安全警告并返回空位置。
  • 哎呀! Downvote :( 它适用于我们的应用程序。也许我们在身份验证过程中做到了......
  • @DMCS 实际上我赞成它!
  • 我看到我的问题被否决了,然后查看了您的声誉 (facebook.stackoverflow.com/users/950039/…) 选项卡,并在其中看到了与我在声誉选项卡中看到的 - 相对应的答案。我现在看到这两个条目都消失了并被清除了。谢谢你解决这个问题。删除我上面的​​评论。
  • @DMCS 很好的追踪你必须申请 FBI ;)
【解决方案2】:

signed_request (http://developers.facebook.com/docs/authentication/signed_request/) 是 authResponse 的一部分,当调用 FB.getLoginStatus() (https://developers.facebook.com/docs/reference/ javascript/FB.getLoginStatus/)

{
    status: 'connected',
    authResponse: {
        accessToken: '...',
        expiresIn:'...',
        signedRequest:'...',
        userID:'...'
    }
}

在签名的请求里面是页面ID。

但是,要使其正常工作,您需要对用户进行身份验证以访问您的应用。但至少您可以在客户端完成所有操作,而无需服务器端脚本。另一个需要记住的非常重要的事项是,您需要您的应用程序机密来解析签名的请求,并且在您的客户端公开该关键机密项可能会非常危险!

如果您的要求表明您既不能对用户进行身份验证,也不能在服务器端处理签名的请求,那么您将无法获取页面 ID 客户端。

为了安全起见,请在服务器端处理signed_request。 :)

编码愉快!

【讨论】:

  • 不幸的是,(如您的回答中所述)您需要连接用户才能真正获得signedRequest
  • 您也可以在不暴露私钥的情况下解析签名请求,只是您无法验证它是否已签名,但您仍然可以解析它。但是,正如您正确所说,用户已登录,或者您只能在服务器端访问它:(
  • 是的,就是这样。要么希望用户不会通过在不使用私钥的情况下在客户端处理代码来欺骗您的代码,要么公开私钥并在客户端正确处理它,或者只是在 Facebook 推荐的服务器端进行。
  • 正如原始问题中所问的“有没有办法单独获取该信息?即使未签名且不安全?”。所以这种方式是完成它的方法,没有签名和不安全。
  • @DMCS 我给你赏金,因为你的答案非常接近我的预期。
猜你喜欢
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
相关资源
最近更新 更多