Symfony - 目标路径在 cURL 上为空,如用户请求
Symfony - Target path is null on cURL like user request
我有一个应用程序对整个站点的访问受限,但登录名和密码恢复除外。
我正在尝试使用基于引用地址的数据添加到登录视图打开图元标记。为此,我在登录操作中使用 \Symfony\Component\Security\Http\Util\TargetPathTrait
,如下所示:
<?php
$referer = $this->getTargetPath($request->getSession(), 'main');
在本地,我使用 Open Graph Preview chrome 插件,它运行良好。作为匿名用户,我尝试访问一个页面,然后重定向到登录页面。这里 $referer
不为空,我可以检索生成元标记所需的数据。
现在在我的生产服务器上的测试环境中,使用 open graph chrome 插件,它仍然有效。通过 Telegram 分享一个 link,预览显示正常。但是当我通过 Facebook Messenger 分享相同的 link 时,我没有得到我想要的。
编辑:也不适用于 Discord 和 WhatsApp。
我用 Facebook 调试器做了一些测试,$referer
似乎是空的,我不明白为什么。 当 Facebook 服务试图查看页面时,Symfony 访问控制似乎有一个特定的行为,因为 symfony 安全组件似乎没有管理会话数据。
应用程序的登录功能非常简单,因为它遵循 Symfony 文档中描述的基本步骤。
有人知道我该怎么做才能解决这个问题吗? 与此同时,我正在尝试使用 Symfony 事件找到解决方法。
编辑 1:我通过 cURL 请求在本地重现了该问题。在那种情况下,似乎没有处理任何会话。 \Symfony\Component\Security\Http\Util\TargetPathTrait::getTargetPath
方法无用,因为 Symfony 将目标路径存储在会话中。
现在,当匿名用户尝试请求受限 URL 时,我将引用作为 GET 参数添加到重定向登录 URL。
太棒了,现在预览在 Discord、WhatsApp 上完美运行,并且仍然在 Telgram 上运行。
遗憾的是,它仍然无法在 Facebook 的应用程序(Messenger 和 Facebook 帖子)上运行。
因此,我查看了 facebook 调试器工具。奇怪的是,FB 服务的重定向 url 请求与我的应用程序通常提供的请求不同。
预期 URL :https://domain.ext/login?referer=https://domain.ext/referer/path
URL FB 要求:https://domain.ext/login?randomCoherentParamName=intValue
奇怪的是'randomCoherentParamName'对应了一个来自referer的路由参数URL.
这是我如何生成重定向 URL:
<?php
// From a class that extends
// Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator
/**
* Override to control what happens when the user hits a secure page
* but isn't logged in yet.
*
* @return RedirectResponse
*/
public function start(Request $request, AuthenticationException $authException = null)
{
$url = $this->urlGenerator->generate('loginRoute', ['referer' => $request->getUri()]);
return new RedirectResponse($url);
}
如果有人知道发生了什么,我将不胜感激 :)。
编辑 2:似乎 FB 服务在重定向时使用规范的 URL 访问登录页面。问题是我从未在我网站的任何页面中设置规范地址元标记。所以,我想知道这怎么可能...
不管怎样,我想我有一个绕过这个问题的解决方案,如果它有效,我会分享,但我真的很想了解 FB 服务是如何工作的,并确定它是如何获得规范的 URL 我'从来没有设置... Apach 故障?交响乐的错?我的错?还是跟Facebook爬虫有关?
任何评论将不胜感激:)
问题已解决!
Facebook 问题完全是我的错,实际上,还有一点是因为 FB 服务。让我解释一下。
当 FB 服务请求共享 URL 时,它会解析响应以查找开放图元标记。在响应解析期间,如果服务检测到 url open graph 元标记,它会请求 url 并使用该响应中的已解析数据生成预览。这种行为似乎是 Facebook 特有的,因为我对 Discord、WhatsApp 和 Telegram 没有任何问题(并且 Telegram 在从 URL 检索数据时处理会话)。
现在,我做错了什么?实际上,我的登录页面有一个 url open graph 元标记,而且,好吧...我没有生成好的 URL 作为它的值...
感谢您的关注:)
我有一个应用程序对整个站点的访问受限,但登录名和密码恢复除外。
我正在尝试使用基于引用地址的数据添加到登录视图打开图元标记。为此,我在登录操作中使用 \Symfony\Component\Security\Http\Util\TargetPathTrait
,如下所示:
<?php
$referer = $this->getTargetPath($request->getSession(), 'main');
在本地,我使用 Open Graph Preview chrome 插件,它运行良好。作为匿名用户,我尝试访问一个页面,然后重定向到登录页面。这里 $referer
不为空,我可以检索生成元标记所需的数据。
现在在我的生产服务器上的测试环境中,使用 open graph chrome 插件,它仍然有效。通过 Telegram 分享一个 link,预览显示正常。但是当我通过 Facebook Messenger 分享相同的 link 时,我没有得到我想要的。
编辑:也不适用于 Discord 和 WhatsApp。
我用 Facebook 调试器做了一些测试,$referer
似乎是空的,我不明白为什么。 当 Facebook 服务试图查看页面时,Symfony 访问控制似乎有一个特定的行为,因为 symfony 安全组件似乎没有管理会话数据。
应用程序的登录功能非常简单,因为它遵循 Symfony 文档中描述的基本步骤。
有人知道我该怎么做才能解决这个问题吗? 与此同时,我正在尝试使用 Symfony 事件找到解决方法。
编辑 1:我通过 cURL 请求在本地重现了该问题。在那种情况下,似乎没有处理任何会话。 \Symfony\Component\Security\Http\Util\TargetPathTrait::getTargetPath
方法无用,因为 Symfony 将目标路径存储在会话中。
现在,当匿名用户尝试请求受限 URL 时,我将引用作为 GET 参数添加到重定向登录 URL。
太棒了,现在预览在 Discord、WhatsApp 上完美运行,并且仍然在 Telgram 上运行。
遗憾的是,它仍然无法在 Facebook 的应用程序(Messenger 和 Facebook 帖子)上运行。
因此,我查看了 facebook 调试器工具。奇怪的是,FB 服务的重定向 url 请求与我的应用程序通常提供的请求不同。
预期 URL :https://domain.ext/login?referer=https://domain.ext/referer/path
URL FB 要求:https://domain.ext/login?randomCoherentParamName=intValue
奇怪的是'randomCoherentParamName'对应了一个来自referer的路由参数URL.
这是我如何生成重定向 URL:
<?php
// From a class that extends
// Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator
/**
* Override to control what happens when the user hits a secure page
* but isn't logged in yet.
*
* @return RedirectResponse
*/
public function start(Request $request, AuthenticationException $authException = null)
{
$url = $this->urlGenerator->generate('loginRoute', ['referer' => $request->getUri()]);
return new RedirectResponse($url);
}
如果有人知道发生了什么,我将不胜感激 :)。
编辑 2:似乎 FB 服务在重定向时使用规范的 URL 访问登录页面。问题是我从未在我网站的任何页面中设置规范地址元标记。所以,我想知道这怎么可能...
不管怎样,我想我有一个绕过这个问题的解决方案,如果它有效,我会分享,但我真的很想了解 FB 服务是如何工作的,并确定它是如何获得规范的 URL 我'从来没有设置... Apach 故障?交响乐的错?我的错?还是跟Facebook爬虫有关?
任何评论将不胜感激:)
问题已解决!
Facebook 问题完全是我的错,实际上,还有一点是因为 FB 服务。让我解释一下。
当 FB 服务请求共享 URL 时,它会解析响应以查找开放图元标记。在响应解析期间,如果服务检测到 url open graph 元标记,它会请求 url 并使用该响应中的已解析数据生成预览。这种行为似乎是 Facebook 特有的,因为我对 Discord、WhatsApp 和 Telegram 没有任何问题(并且 Telegram 在从 URL 检索数据时处理会话)。
现在,我做错了什么?实际上,我的登录页面有一个 url open graph 元标记,而且,好吧...我没有生成好的 URL 作为它的值...
感谢您的关注:)