edp963 / davinci

Davinci is a DVsaaS (Data Visualization as a Service) Platform
https://edp963.github.io/davinci
Apache License 2.0
4.91k stars 1.82k forks source link

前端打包发布后login获取到了JWT令牌,但是紧随的两个请求全部报403错误,无法进入主界面 #2273

Closed sichuanwuyi closed 2 years ago

sichuanwuyi commented 2 years ago

前端打包发布后login获取到了JWT令牌,但是紧随的两个请求全部报403错误,无法进入主界面。 下图为报错的两个请求,这两个请求在服务器端断点调试的结果是:请求头中没有授权信息 1636536755(1)

以下是登录请求的应答:(第二张图显示已经获取到了JWT令牌) 1636536899(1) 1636537006(1)

scottsut commented 2 years ago

这是使用统计接口,没配置或是用不到就关掉

https://edp963.github.io/davinci/docs/zh/1.1-deployment#248-%E4%BD%BF%E7%94%A8%E7%BB%9F%E8%AE%A1%E9%85%8D%E7%BD%AE

https://edp963.github.io/davinci/docs/zh/4.1-statistic

sichuanwuyi commented 2 years ago

@scottsut 关掉也没有用,前端代码中登录后就会发起这两个请求,服务器端授权拦截器对这两个请求进行授权验证时,读取授权令牌为null, 就直接返回403了。 1636543287(1) 服务器端授权拦截器代码截图如下: 1636543449(1)

scottsut commented 2 years ago

嗯,你不需要就注释掉吧

sichuanwuyi commented 2 years ago

@scottsut , 我把前端发送这两个请求的代码屏蔽掉后,登录后仍无法跳转的主界面上去。浏览器控制台没有报错吴。不知道怎么才能进入主界面。

scottsut commented 2 years ago

这两个请求和登录跳转没有直接关系,看看你们是不是改了别的问题导致的

image

sichuanwuyi commented 2 years ago

@scottsut 我下载源码后没有改过。npm install 后直接build前端代码,并拷贝到davinci-ui目录下,然后运行前端脚本start,最后在浏览器访问http://localhost:8080。此时浏览器能显示登录页面,但是输入账号guest , 密码:123456,点击登录按钮后一直显示loading小图标。调试的结果是:login请求成功返回了JWT令牌,但是随后发起的两个统计请求服务器端拦截器报403错误(原因是在请求头中读取不到Authorization信息)。跟你交流后,我做了如下测试: 1 .将服务器端上述两个统计请求的Controller方法上标注@AuthIgnore。结果:服务器端处理返回数据时取令牌进行处理报null错误。

  1. 恢复前述对服务器端的改动,将前端的两个统计请求屏蔽掉(尽量贴近request方法进行屏蔽,这两个方法对Store内部的State没有影响)。结果:点击登录后还是一直显示loading图标。在浏览器中可以看到最后一个发起的请求login,httpstatus=200。感觉就是登录后前端没有向主界面跳转。我正在查找进入主界面的代码....., 希望可以得到指点。
sichuanwuyi commented 2 years ago

@scottsut history.replace('/') 就是进入主界面的代码吗?

sichuanwuyi commented 2 years ago

@scottsut 有一些疑问:

  1. 用户登录后返回的JWT令牌,在后续请求中是怎么放入Header中的Authorization域上传的?我的理解是:应该由服务器端将令牌写入Cookie中,浏览器的后续请求会根据跨越设置自动带上Token。如果不是这个机制,那么前端在发起请求时需要在HTTP请求的Header中设置Authorization域信息。我在前端代码中没有找到类似处理。
  2. 服务器端登录成功后的返回处理代码中没有向Cookie写入Token的动作,JWT令牌时直接通过Body返回给前端的。
  3. 在浏览器端Cookie中http://localhost:8080域下没有任何数据(我已经开启了浏览器允许写入Cookie设置),说明不是依靠Cookie来保存令牌信息的。
scottsut commented 2 years ago

jwt token 记录在 localStorage 中,在每次请求的响应体中获取并更新,具体代码在 webapp/app/utils/request.ts 中。

history.replace('/') 就是跳转代码,理论上登录成功就会执行跳转,你这边提供的信息不足以判断问题原因,我建议你在登录流程的前端代码上找一下具体原因

sichuanwuyi commented 2 years ago

@scottsut 问题解决了:默认server端的application.yml文件中没有配置jwtToken.timeout参数,导致前端取回去的令牌超时时间为0。服务器端应该检查这个关键参数的有效性。