symfony4在api key authentificator中获取头文件

时间:2018-03-09 11:10:44

标签: php api symfony http symfony4

我想将登录控制器中获取的 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,我设法在家庭控制器和authentificator中获取它,为什么我不能用标题?

如何使用symfony请求/响应正确设置和访问HTTP标头,并使其可以从authentificator访问?

1 个答案:

答案 0 :(得分:0)

您在此处误解了HTTP请求/响应标头的用途。标题本身不是像你一样以这种原始形式设计的,用于表示任何类型的会话或持久性。 HTTP本身是非常无状态的,没有任何请求与任何其他请求相关。

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

Cookies正是您所需要的。通常,您也不必担心它们,因为PHP具有您可以根据需要存储的会话变量,使用单个cookie将未来请求与一组会话变量相关联。 (会话标识符cookie,通常命名为" PHPSESSID"。)

登录控制器应该在验证用户是真的后,在PHP的会话变量中存储与用户认证的会话相关的任何内容。完成后,cookie将被传递到客户端Web浏览器,而无需您采取进一步操作。

-

这个解释只是概念性的。 Symfony是一个非常完整的框架,taken care of this concept for you。评论// or if you want to use an "apikey" header, then do something like this:主要用于自定义Web客户端(应用)。如果您的目标是拥有自定义客户端HTTP / Web客户端,那么您的工作就是记住应用程序内存中其他地方的令牌变量,这些变量不会作为标准在HTTP模块中使用。

我认为您在链接的文章中可能需要的内容特别是关于storing authentication in the session的部分。然后,HTTP客户端只需要提供一次API密钥。

-

至于安全性,对于知道如何构建HTTP请求的任何人来说,HTTP头并不比查询变量更安全。 (这是HTTP的基本知识。)这与post变量不比查询变量更安全。

  • 如果您使用标准网络浏览器,唯一的好处是没有在地址栏中看到API密钥,但是您应该为这些客户端使用会话cookie,而不是在每个后​​续请求中使用API​​密钥
  • 如果您正在为应用创建自定义Web客户端,那么隐藏在HTTP流量中的人可以看到自定义标头,就像查询变量一样容易。

实施HTTPS是唯一可以有效隐藏来自流量嗅探器的自定义HTTP标头或查询变量的方法,为请求的每个部分提供完全相同的保护,以及后续响应。