当前位置: 首页 > 知识库问答 >
问题:

symfony4在api密钥身份验证程序中获取标头

黄飞翮
2023-03-14

我想将登录控制器中获得的API令牌作为HTTP头传递,以允许ApiKeyAuthentificator使用$apiKey=$request读取它-

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

  • 在登录控制器

返回reponse之前,我设置了一个apikey超文本传输协议头:

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

成功重定向到home后,如果我var_dump标头,标头没有设置并且请求-

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

但是在home的GET请求中没有设置头,我想这就是为什么我不能使用$apiKey=$request在home控制器中获取头的原因-

  • 在ApiKeyAuthentificator中

同样的问题。无法使用$apiKey=$request访问HTTP标头-

如果我设置了一个cookie,我设法在家庭控制器和Authentificator中得到它,为什么我不能有一个标题?

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


共有1个答案

赏成益
2023-03-14

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

您的应用程序可以,也正在,在其响应中提供一个标题,但实际上没有任何理由说明为什么web浏览器应该在将来的请求中再次包含相同的标题,以便链接请求。只有定制的HTTP客户机/实现(如定制的本机移动/平板电脑应用程序)才会故意在HTTP头中直接包含API密钥/令牌。(如果没有强大的Javascript实现来处理所有的导航,任何标准的web浏览器都无法做到这一点。)

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

一旦登录控制器验证了用户是真实的,它就应该在PHP的会话变量中存储与用户经过身份验证的会话相关的任何内容。一旦完成,cookie将被传递到客户端网络浏览器,无需您采取进一步行动。

--

不过,这种解释只是概念性的。Symfony作为一个非常完整的框架,已经为您考虑了这个概念。注释//或者如果要使用“apikey”标题,请执行类似操作:主要用于自定义web客户端(应用程序)。如果您的目标是拥有一个定制的客户端HTTP/web客户端,那么您的工作就是记住应用程序内存中其他地方的令牌变量,而这不是HTTP模块中的标准变量。

我认为您可能需要从我链接的文章中特别了解关于在会话中存储身份验证的部分。HTTP客户端将只需要提供一次API密钥。

--

至于安全性,对于任何足够聪明的人来说,HTTP标头并不比查询变量更安全,因为他们知道HTTP请求是如何构造的。说明:这是HTTP的基础知识。这与后变量不比查询变量安全一样。

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

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

 类似资料:
  • 面向公共的服务需要api密钥。 “专用”服务只能接受来自群集内部的呼叫,而不能接受外部世界的呼叫。 每个api都标识一个用户,并且用户对象必须可用于rest服务。 在一个JAX-RS应用程序中有什么标准的方法可以做到这一点吗?(我们用的是resteasy。) 我读过关于过滤器、拦截器和基本身份验证的所有内容,但我不清楚什么是最好的方法。

  • 问题内容: 我正在用TastyPie制作内部API。我有 禁用身份验证规则后,我的API效果很好。启用它后,无论尝试如何,都会收到401(未经授权)的响应。 我敢肯定,一旦你看到它的实际作用,这就是其中的一件事,但与此同时,请告知如何提出请求(GET)。 问题答案: 将用户名和api_key参数添加到你的GET变量中。确保你拥有 设置时,请确保遵循docs的其他说明: ApiKey身份验证 作为要

  • 这是我第一次尝试使用API,API被称为OPS。我希望在python代码中使用API(OAuth 2)获取信息。 资源URL为:http://ops.epo.org/3.2/rest-services/register/{publication}/{EPODOC}/{EP2814089}/biblio 我还收到了: 消费密钥: O220VlTQqA修改fiedsf0YeqgM6c 消费者秘密密钥:

  • 嗨,好几天了,我都被困在这上面了!在使用本指南转换我的react应用程序后,我尝试使用KeyClope对我的electron应用程序进行身份验证。 当我运行'npm运行电子:dev'时,keyCloak会重定向到登录页面。然而,当我运行'npm运行电子:prod'这失败。 来自KeyClope服务器的日志显示: 请注意,重定向_uri是'file:///...“我相信这就是原因。 我也试图改变下面

  • 问题内容: 我正在开发一个RailsWeb应用程序,该应用程序还为移动设备提供了基于JSON的API。移动客户端应首先通过(电子邮件/通过)获得令牌,然后客户端将使用该令牌进行后续的API调用。 我对Devise相当陌生,我正在寻找一个Devise API外观,并希望它返回true / false,然后基于此,我将创建并返回令牌或返回拒绝消息。但似乎Devise没有提供类似的信息。 我知道Devi

  • 本文向大家介绍asp.net mvc中Forms身份验证身份验证流程,包括了asp.net mvc中Forms身份验证身份验证流程的使用技巧和注意事项,需要的朋友参考一下 验证流程 一、用户登录 1、验证表单:ModelState.IsValid 2、验证用户名和密码:通过查询数据库验证 3、如果用户名和密码正确,则在客户端保存Cookie以保存用户登录状态:SetAuthCookie     1