symfony4 get header in api key authentificator



我想将登录控制器中获得的API令牌作为HTTP标头传递,以允许ApiKeyAuthentificator使用$apiKey = $request->headers->get('apikey');读取它。

我曾经使用查询参数使其工作,但这似乎不安全。


  • 在登录控制器中

我在返回响应之前设置了一个 apikey http 标头:

$response = $this->redirectToRoute('home');                                  
$response->headers->set('apikey', $data->token);                 
return $response;
  • 在家庭控制器中

成功重定向到主页后,如果我var_dump标头,则不会设置标头,并且request->headers->get('apikey')返回null

但是,重定向后,如果我打开网络检查器并从登录控制器查找 POST 请求,则会设置标头。

但是标头没有在家庭的GET请求中设置,我想这就是为什么我无法使用$apiKey = $request->headers->get('apikey');在家庭控制器中获取它的原因


  • 在 ApiKeyAuthentificator 中

同样的问题。无法使用$apiKey = $request->headers->get('apikey');访问 HTTP 标头


如果我设置了一个cookie,我设法在家庭控制器和身份验证器中获取它,为什么我不能使用标题?

如何使用symfony请求/响应正确设置和访问HTTP标头,并使其可从身份验证器访问?

你误解了HTTP请求/响应标头的目的。标头本身不是像您所做的那样以这种原始形式设计的,以指示任何类型的会话或持久性。HTTP本身是非常无状态的,没有任何请求与任何其他请求相关。

您的应用程序可以并且正在在其响应中给出标头,但实际上根本没有理由为什么 Web 浏览器应该在将来的请求中再次包含相同的标头以链接请求。只有自定义 HTTP 客户端/实现(例如定制的本机移动/平板电脑应用)才会故意直接在 HTTP 标头中包含 API 密钥/令牌。(没有标准的Web浏览器可以做到这一点,所以没有一些强大的Javascript实现来处理几乎所有的导航。

饼干正是您在这里所需要的。通常你也不需要担心它们,因为PHP有会话变量,你可以随心所欲地存储这些变量,单个cookie用于将未来的请求与一组会话变量相关联。(会话标识符cookie,通常称为"PHPSESSID"。

登录控制器在验证用户是真实的后,应该将与用户经过身份验证的会话相关的任何内容存储在 PHP 的会话变量中。完成此操作后,Cookie 将传递到客户端网络浏览器,您无需执行进一步操作。

--

不过,这种解释只是概念性的。Symfony是一个非常完整的框架,已经为你解决了这个概念。注释// or if you want to use an "apikey" header, then do something like this:主要针对自定义 Web 客户端(应用程序)。如果您的目标是拥有自定义客户端 HTTP/Web 客户端,那么您的工作是记住应用程序内存中其他位置的令牌变量,这些变量不会作为标准在 HTTP 模块中。

我认为您从我链接的文章中可能需要的是在会话中存储身份验证的部分。然后,HTTP 客户端只需提供一次 API 密钥。

--

至于安全性,对于任何足够聪明的人来说,HTTP标头并不比查询变量更安全,知道HTTP请求的结构。(这是HTTP的基本知识。这与后变量不比查询变量安全相当。

  • 如果您使用的是标准 Web 浏览器,唯一的好处是不会在地址栏中看到 API 密钥,但无论如何您都应该为这些客户端使用会话 cookie,而不是在每个后续请求中使用 API 密钥。
  • 如果您正在为应用程序创建自定义 Web 客户端,那么自定义标头对于窥探 HTTP 流量的人来说是可见的,就像查询变量一样容易。

强制执行 HTTPS 是有效地从流量嗅探器隐藏自定义 HTTP 标头或查询变量的唯一方法,为请求的每个部分和后续响应提供完全相同的保护。

最新更新