奇怪的URL后缀“#_=_”

34

可能是重复问题:
如何在OAuth2通过Facebook身份验证后使用Play Framework附加“#= ”?

有其他人也遇到过这个问题吗?

我正在使用Facebook PHP SDK和一些JavaScript构建Facebook画布应用程序。
现在,当我让用户通过OAuth身份验证流程时,我注意到浏览器中的URL会自动添加"#_=_",因此我的URL看起来像这样:

http://apps.facebook.com/xxxxxxxxxxxx/#_=_

当我重定向到应用程序配置文件页面时,URL 是这样的:

http://www.facebook.com/apps/application.php?id=xxxxxxxxxxxx#_=_

我正在使用重定向

echo "<script type='text/javascript'>top.location.href='$appcanvasurl';</script>"

将URL添加到画布,并

echo "<script type='text/javascript'>top.location.href='$appprofurl';</script>"

用于应用程序个人资料页面。

那么为什么会附加这个#_=_呢?

更新:

根据跟踪器上的此错误,这是设计问题,并且提供redirect_uri的值并不会改变这一点。

根据该页面上的官方Facebook回复(必须登录 Facebook 才能查看帖子):

这被标记为“按设计”,因为它可以防止潜在的安全漏洞。

一些浏览器将从 URL 的哈希片段附加到它们被重定向到的新 URL 的末尾(如果该新 URL 本身没有哈希片段)。

例如,如果 example1.com 返回到 example2.com 的重定向,则浏览器转到 example1.com#abc 将转到 example2.com#abc,并且 example1.com 的哈希片段内容将可被 example2.com 上的脚本访问。

由于可能将一个验证流重定向到另一个验证流,因此可能会将一个应用程序的敏感验证数据访问另一个应用程序。

通过附加新的哈希片段来防止这种浏览器行为来减轻这种情况。

如果担心结果 URL 的美观度或客户端行为,可以使用 window.location.hash(甚至是自己的服务器端重定向)来删除有问题的字符。


1
我注意到即使已经指定了redirect_uri,仍然会附加#_=_。不过有一个解决方法,可以在这里使用javascript:https://dev59.com/questions/7mw05IYBdhLWcg3wnjHC,并且在这里:http://facebook.stackoverflow.com/questions/7338853/php-location-header-ignore-hash/7340855#7340855 - bool.dev
将以下内容添加到您的头标签中以解决此问题:<script type="text/javascript">if (window.location.hash == '#=')window.location.hash = '';</script> - Safran Ali
@SafranAli,这并没有解决问题,对于我迟迟没有跟进此事,请多多包涵。window.location.hash 是空的,只有父级或顶级 location 才有这个 hash。这里的 window 指的是应用程序运行的 iframe,父框架的 hash 为 #_=_。请分享你的想法。 - bool.dev
1个回答

17

太棒了,谢谢,必须继续阅读博客,而不仅仅是代码 :) - bool.dev
1
当哪个字段留空时?我只得到了这个,没有其他信息。答案是什么? - Antony D'Andrea
@AntonyD'Andrea,你能找到造成这个问题的空白字段的答案吗? - Edmund Rojas
@EdmundRojas 我避免这个错误的唯一方法是将类型发送为“token”而不是“code”(尽管文档说它可以是其中之一),然后我在片段中获得一个令牌。虽然代码本应该在参数中,但这很烦人。但至少我有一个令牌可以做些事情,而不是什么都没有。 - Antony D'Andrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接