我想将登录控制器中获取的 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');
同样的问题。无法使用$apiKey = $request->headers->get('apikey');
如果我设置了一个cookie,我设法在家庭控制器和authentificator中获取它,为什么我不能用标题?
如何使用symfony请求/响应正确设置和访问HTTP标头,并使其可以从authentificator访问?
答案 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变量不比查询变量更安全。
实施HTTPS是唯一可以有效隐藏来自流量嗅探器的自定义HTTP标头或查询变量的方法,为请求的每个部分提供完全相同的保护,以及后续响应。