首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring OAuth2 - JWT令牌在服务器上工作,但不在本地主机上工作?

Spring OAuth2 - JWT令牌在服务器上工作,但不在本地主机上工作?
EN

Stack Overflow用户
提问于 2022-09-15 19:21:53
回答 1查看 149关注 0票数 0

我看到myapp能够在服务器上正确地处理OAuth2 JWT令牌,但是它在本地主机上出现令牌转换错误。

我的流如下所示-

On Servermyapp自定义 api-gateway后面

  1. 获取访问令牌-通过postman,我点击api网关令牌端点,然后调用authserver令牌端点。我得到了OAuth JWT令牌作为响应。

总之,邮递员

请求:-(Creds)->api-网关-(Samecreds)-> auth-server

响应: jwt令牌<-(相同jwt)-- api-网关<-(Jwt)-auth服务器

  1. 接下来,我点击了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有效载荷如下:

代码语言:javascript
复制
{
  "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网关后面,而是直接命中。

  1. 通过邮递员获得访问令牌,我点击了api网关(与上面服务器流中的服务器实例相同)。也就是说,api-网关/auth-服务器的服务器不在本地主机上运行,而是运行在服务器上)令牌端点,后者反过来调用authserver令牌端点。我得到了OAuth JWT令牌作为响应。

因此,邮递员请求:-(Creds)->api-网关-(Samecreds)-> auth-server。

响应: jwt令牌<-(相同的jwt)-- api-网关<-(Jwt)-- auth-server

是的,此令牌可以在服务器流步骤2中使用,并且可以工作。解码的JWT令牌有效载荷与我之前发布的相同,即

代码语言:javascript
复制
{
  "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客户端发出令牌。我还不确定这个领域是微不足道的还是重要的。

  1. 接下来,我再次通过postman访问了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库如下所示-

  1. org.springframework.security:spring-security-oauth2-jose:5.4.2
  2. org.springframework.cloud:spring-cloud-starter-oauth2:2.1.3.RELEASE

给出错误的类是:OAuth2AuthenticationProcessingFilter.java (API文档)

EN

回答 1

Stack Overflow用户

发布于 2022-09-16 11:04:54

对不起,我不会回答您的问题(@Toerktumlare是对的,您的安全配置丢失了),但是我将尝试解释为什么我不把API网关变成一个OAuth2客户端。

简单地说,API网关的作用是成为系统资源的黑匣子,这可能使它被视为资源服务器,但在我看来,它应该对OAuth2 (和其他身份验证机制)保持透明。保持简单:

  • 客户端 (UI)处理用户登录(当需要时)
  • resource-servers控制对资源的访问
  • 网关(如果有的话)应该尽可能保持透明,只为所有资源提供一个单一的入口点。

在你的故事里:

  • 如果您被要求实现多因素身份验证,您会如何期望:除了登录/密码之外,还需要一个生物测试、外部应用程序验证、Goolgle身份验证令牌等等?除了授权服务器之外,您真的打算在网关中实现所有这些吗?
  • 如果它总是将api-gw-client作为客户端ID,那么授权服务器如何实现基于客户端的处理(比如检查请求的作用域对于客户端是合法的,或者向访问令牌添加客户端权限)?
  • 如何处理多租户方案(网关后面的R1R2资源服务器期望来自不同颁发者的身份,或者C1C2客户端不使用相同的授权服务器对用户进行身份验证)?
  • 如果某些客户端和资源服务器使用的是OAuth2以外的其他东西,该怎么办?

此外,客户端必须知道在每个API端点(XML、JSON、PDF、multipart等)上接受和生成何种媒体类型。并相应地设置Content-typeAccept头。为什么Authorization头会有所不同呢?

在我看来,如果您想节省时间和精力,请使用API网关代理您的资源-服务器只有。保留授权-服务器端。对于外部API,您没有维护,但您的客户需要,如果有的话(推特提要,谷歌API等)。

这就是我总是配置资源服务器的方式。

  • Authorization标头丢失或无效(格式错误、过期、发出者错误、访问权限差等) => 401 (未经授权)而不是302 (重定向登录)
    • 在多租户场景中,资源服务器为什么要费心找出要重定向到哪个授权服务器?
    • 对于没有在浏览器中运行的客户端,比如移动应用程序,重定向应该意味着什么?

  • Authorization报头是有效的,但相关声明无法通过访问控制(例如,错误的权限或预期的主题) => 403 (禁止)

客户端应该知道如何提供所需的访问令牌,以及如何在发送请求时设置Authorization头(这是您当前使用邮递员所做的)。它甚至可以拦截401来触发用户身份验证,然后重试失败的资源访问。严重的OAuth2客户端librairies (如角钢客户端的角度)提供了这样的功能。

有了这样的客户端,网关可以充当资源服务器(以及授权服务器或外部API(如果您愿意的话)的外观,但是为什么?),转发Authorization头并完全忽略用户登录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73736384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档