我看到myapp能够在服务器上正确地处理OAuth2 JWT令牌,但是它在本地主机上出现令牌转换错误。
我的流如下所示-
On Server,myapp在自定义 api-gateway后面
总之,邮递员
请求:-(Creds)->api-网关-(Samecreds)-> auth-server
响应: jwt令牌<-(相同jwt)-- api-网关<-(Jwt)-auth服务器
myapp 端点--再一次通过postman,我点击了api-网关端点,这些端点依次到达了相应的myapp端点。我得到了所需的回应。对于这个请求,在访问api-网关之前,我设置了报头Authorization: Bearer JWT from step1。作为myapp开发人员,我知道api-网关使用相同的头机制(即Authorization: Bearer JWT from step1 )将JWT令牌重新发送到myapp。从日志中,我看到这是我在邮递员访问api-gateway时提供的相同值。
所以,邮递员请求:-(Jwt)->api-网关-(相同jwt)-> myapp
响应是一些数据,这对于本讨论来说是微不足道的。
已解码的JWT有效载荷如下:
{
"app-userId": "c54a-4140-9fa0-0f39",
"user_name": "abc@xyz.com",
"scope": [
"all"
],
"exp": 1656929583,
"authorities": [
"app1_viewer",
"app1_modifier",
"app2_viewer",
"app2_blog_creator],
"client_id": "api-gw-client"
...
}请注意- "client_id": "api-gw-client"字段在上面的有效载荷。因此,auth服务器向api-gateway客户端发出令牌。
现在,在mylocal上,即在localhost上运行myapp --我正在尝试实现与服务器上类似的流。
在localhost上,myapp不是运行在api网关后面,而是直接命中。
因此,邮递员请求:-(Creds)->api-网关-(Samecreds)-> auth-server。
响应: jwt令牌<-(相同的jwt)-- api-网关<-(Jwt)-- auth-server
是的,此令牌可以在服务器流步骤2中使用,并且可以工作。解码的JWT令牌有效载荷与我之前发布的相同,即
{
"app-userId": "c54a-4140-9fa0-0f39",
"user_name": "abc@xyz.com",
"scope": [
"all"
],
"exp": 1656929583,
"authorities": [
"app1_viewer",
"app1_modifier",
"app2_viewer",
"app2_blog_creator],
"client_id": "api-gw-client"
...
}请再次注意- "client_id": "api-gw-client"字段在上面的有效载荷。因此,auth服务器向api-gateway客户端发出令牌。我还不确定这个领域是微不足道的还是重要的。
myapp localhost端点,但我直接命中了myapp端点(而不是通过运行在本地主机上的api网关)。对于这个请求,在点击之前,我设置了头Authorization: Bearer JWT from step1。,但这次我得到了错误:
p.a.OAuth2AuthenticationProcessingFilter :身份验证请求失败: error="invalid_token",error_description=“无法将访问令牌转换为JSON”
我想知道是什么导致了这个错误。我不认为这是client_id: api-gw-client造成的。无论如何,我使用client_id: myapp创建了一个签名的jwt令牌,并在请求中使用了它。但我还是犯了同样的错误。
我在本地主机上使用的key与服务器用来签名的匹配(对应)。我检查了两遍。因此,这肯定不是key问题。
我需要基于本地主机的设置工作,所以我可以在本地测试api,而不需要部署到服务器(在我的情况下,部署到服务器非常耗时)。所以,这个设置对我来说是非常重要的,以满足我的最后期限。任何答案/建议都是非常感谢的。
在我的项目中使用的Spring OAuth2库如下所示-
org.springframework.security:spring-security-oauth2-jose:5.4.2org.springframework.cloud:spring-cloud-starter-oauth2:2.1.3.RELEASE发布于 2022-09-16 11:04:54
对不起,我不会回答您的问题(@Toerktumlare是对的,您的安全配置丢失了),但是我将尝试解释为什么我不把API网关变成一个OAuth2客户端。
简单地说,API网关的作用是成为系统资源的黑匣子,这可能使它被视为资源服务器,但在我看来,它应该对OAuth2 (和其他身份验证机制)保持透明。保持简单:
在你的故事里:
api-gw-client作为客户端ID,那么授权服务器如何实现基于客户端的处理(比如检查请求的作用域对于客户端是合法的,或者向访问令牌添加客户端权限)?R1和R2资源服务器期望来自不同颁发者的身份,或者C1和C2客户端不使用相同的授权服务器对用户进行身份验证)?此外,客户端必须知道在每个API端点(XML、JSON、PDF、multipart等)上接受和生成何种媒体类型。并相应地设置Content-type和Accept头。为什么Authorization头会有所不同呢?
在我看来,如果您想节省时间和精力,请使用API网关代理您的资源-服务器只有。保留授权-服务器端。对于外部API,您没有维护,但您的客户需要,如果有的话(推特提要,谷歌API等)。
Authorization标头丢失或无效(格式错误、过期、发出者错误、访问权限差等) => 401 (未经授权)而不是302 (重定向登录) Authorization报头是有效的,但相关声明无法通过访问控制(例如,错误的权限或预期的主题) => 403 (禁止)客户端应该知道如何提供所需的访问令牌,以及如何在发送请求时设置Authorization头(这是您当前使用邮递员所做的)。它甚至可以拦截401来触发用户身份验证,然后重试失败的资源访问。严重的OAuth2客户端librairies (如角钢客户端的角度)提供了这样的功能。
有了这样的客户端,网关可以充当资源服务器(以及授权服务器或外部API(如果您愿意的话)的外观,但是为什么?),转发Authorization头并完全忽略用户登录。
https://stackoverflow.com/questions/73736384
复制相似问题