JWT Token验证失败(VUE前端注册后登录失败)

刘师傅
刘师傅
擅长邻域:Java,HTML,JavaScript,CSS,SQL,ORACLE,MySQL,SQL SERVER,Spring 全家桶

分类: Java 标签: JWT token 验证失败

2020-10-25 19:42:36 1446浏览

一次JWT Token验证失败的排错经历。
背景:一位客户的系统,前后端分离部署,管理后台登录正常(通过传统用户名+密码验证方式)登录正常,但是前端注册的新用户无法登录(用户名+密码+JWT Token验证方式)。

首先尝试复现该Bug,发现登录页面提交登录请求时是成功的,F12也能看到后台返回的成功信息和JWT Token,但后续跳转到首页时,又提示请先登录。所以该系统准确的问题应该是登录成功,但后续访问其他页面时依然提示未登录。

其一,怀疑是前端请求未带上JWT Token,导致后端验证失败。然而F12查看请求信息狠狠打脸,请求头中确实包含了该Token.


其二,难不成是前端发送的Token和后端不一致,导致后续验证失败?再次比对登录返回的Token和请求首页时发送的Token,完全一致!



其三,有没有可能是后端本身没有保存住生成的Token,造成登录状态没有保持?这一点从根本上不可能,因为JWT Token本质是签发和验签,本身就保存了签名算法和签名内容等信息,验证时只需要将Payload用同样的签名密钥按照生成算法计算后比对即可。

其四,注意到后端架构未Nginx反代Tomcat,有没有可能是Nginx配置有问题呢?查看配置后并没有发现异常(这里相信经验给后面造成了不小的麻烦)。此时时钟已走向00:15,不得不斟上一盏浓茶,以驱困意。

其五,由于后端校验时没有输出任何有用信息和日志,无奈,只好开始对代码进行审计。从登录逻辑到校验逻辑,再到相关工具类,最后到签名密钥,都没有发现问题,此时开始头痛,不得不喊下暂停,睡觉充电。

翌日,打开电脑,还是决定先解决这个疑难杂症。回忆昨晚的解决过程和思路,确实没有问题,但这里面肯定有一步出了差错。

彷徨,突然,留意到Token是在HTTP Header中传输的,而且后端架构又是Nginx反代,难道是被Nginx过滤了请求头导致的?但配置中没有显式排除头部信息的相关配置项,那就是被默认行为过滤了。果然,该Token的传输使用了“JWT_TOKEN”作为参数名称,最后的犹太就是这根下划线!找到问题就简单了:两个办法,第一是修改代码,更换Token传输的参数名称;二是修改Nginx配置,增加“underscores_in_headers on;”配置项,允许带下划线请求头。综合考量,选择了后者,重启Nginx,登陆成功!




=============================================================
最后推荐大家一个编程问答的网站:
平台网址: https://www.jf3q.com

好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

客服QQ 1913284695