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 作为它的值...

感谢您的关注:)