boot版本 使用nginx做服务端负载均衡,会偶尔出现服务端401的问题“请求未授权”

Blade 未结 3 1139
ahjrlc
ahjrlc 剑圣 2021-10-29 09:49

一、该问题的重现步骤是什么?

1. boot版本 使用NGINX 做服务端负载均衡,会偶尔出现服务端401的问题“请求未授权”。

2. boot版本,在本地模拟做负载均衡,同事A电脑上开启一个服务,开启一个nginx服务,配置负载,同事B电脑上只开启一个服务,两个服务代码完全相同。登录的时候会先后调用两个接口,接口1:blade自带的获取token接口;接口2:根据接口1返回的token获取用户详细信息。如果第一个获取token的请求先到达A的电脑上,第二获取用户信息的请求到达B的电脑上,会提示签名认证失败,定位到代码是下面这段。

image.png

3.奇怪的是,如果在B的电脑上打上断点,就不会报这个错。

4.nginx配置如下

image.png

二、你期待的结果是什么?实际看到的又是什么?

boot单体版本支持nginx负载均衡。

三、你正在使用的是什么产品,什么版本?在什么操作系统上?


四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。



3条回答
  • 2021-11-01 15:11

    jwt是分布式无状态认证,不管负载到哪一台服务器,只要token合法,都是可以认证通过的。

    如果是多台服务器注意要做好时钟同步,jwt是会校验时间戳的。

    你的情况需要在截图处打log,看一下未授权时请求头的token是什么,然后再进行排查

    0 讨论(0)
  • 2021-11-08 14:37

    多台服务时间不一致导致的这个问题,在生成的token时候调用了setNotBefore(Date nbf)方法,token解析时,如果解析时间在设置的nbf时间之前,就会报错,最终导致上述截图地方返回的是null

    0 讨论(0)
  • 2024-11-13 13:43

    想问解决了么....我现在做nginx负载均衡也出现这个问题了。

    作者追问:2024-11-13 13:45

    是多台服务器么?如果是多台做一下时钟同步再看看

    0 讨论(2)
提交回复