我希望将登录控制器中获得的API令牌作为 header传递,以允许ApiKeyAuthentificator使用$apiKey = $request->headers->get('apikey');读取它。
我以前使用查询参数使其工作,但这似乎不安全。
在返回reponse之前,我设置了一个apikey http头:
$response = $this->redirectToRoute('home');
$response->headers->set('apikey', $data->token);
return $response;成功地重定向到主后,如果我var_dump头,则标头是not set,request->headers->get('apikey')返回null。
但是,在重定向之后,如果我打开网络检查器并查找来自登录控制器的POST请求,则会设置报头。
但是标题没有在家庭的GET请求中设置,这就是为什么我不能使用$apiKey = $request->headers->get('apikey');在家庭控制器中获得它。
同样的问题。无法使用$apiKey = $request->headers->get('apikey');访问header
如果我设置了一个cookie,我设法在主控制器和身份验证器中获得它,为什么我不能用一个头呢?
如何使用symfony请求/响应正确设置和访问HTTP报头,并使其可从身份验证器访问?
发布于 2018-03-09 20:35:11
您在这里误解了HTTP请求/响应头的用途。头本身并不像您所做的那样以此原始形式设计来指示任何类型的会话或持久性。HTTP本身是非常无状态的,没有任何请求与随之而来的任何其他请求相关。
您的应用程序可以,而且正在,在其响应中给出一个标头,但从字面上讲,web浏览器没有理由在将来的请求中再次包含相同的标题,以便链接请求。只有自定义的HTTP客户机/实现(例如定制的本地移动/平板应用程序)才会故意将API密钥/令牌直接包含在HTTP报头中。(没有任何标准的web浏览器会这样做,除非有一些强大的Javascript实现来处理所有导航。)
饼干正是你需要的。通常,您也不需要担心它们,因为PHP有会话变量,您可以任意存储这些变量,使用单个cookie将未来的请求与一组会话变量关联起来。(会话标识符cookie,通常命名为“PHPSESSID”)。
登录控制器应该在PHP的会话变量中存储任何与用户经过身份验证的会话相关的内容,一旦它验证了用户是真实的。一旦完成,cookie将传递给客户端web浏览器,而不需要您采取进一步的操作。
--
不过,这个解释只是概念性的。Symfony是一个非常完整的框架,它有帮你处理好这个概念。评论// or if you want to use an "apikey" header, then do something like this:主要是为一个定制的网络客户端(应用程序)。如果您的目标是拥有一个自定义客户端HTTP/web客户端,那么在应用程序内存中的其他地方记住令牌变量是您的工作,而HTTP模块不是标准的。
我认为您可能需要从我所链接的这篇文章中具体地看到关于在会话中存储身份验证的部分。HTTP客户端将只需要提供一次API密钥。
--
至于安全性,HTTP头对任何聪明到知道HTTP请求是如何构造的人来说,并不比查询变量更安全。(这是HTTP的基本知识。)这与post变量不比查询变量更安全。
执行HTTPS是有效地向流量嗅探器隐藏自定义HTTP报头或查询变量的唯一方法,为请求的每个部分提供完全相同的保护,以及随后的响应。
https://stackoverflow.com/questions/49192448
复制相似问题