问题产生原因

出现此类问题的原因一般是由于访问项目页面时,未登录或认证失败导致重定向到用户中心登录页,用户进行登录,成功后跳转到项目页面,项目页面发起认证请求但是认证失败重定向回用户中心登录页,用户中心此时已经是登录状态了又跳转到项目页面,所以这时候进入了一个死循环状态,页面一直来回跳转。

问题排查思路

根据项目架构方式的不同大致分为两种情况:

  1. 分布式微服务架构,应用通过feign调用用户中心认证接口进行统一认证实现单点登录。例如:电信集团综合调度系统等。

排查思路:

  1. 1. 检查后端bootstrap.yml配置文件中的nacos配置是否正确,是否和用户中心在同一个命名空间和分组下
idc:
  nacos:
    # nacos配置中心ip和端口
    server-addr: 192.168.xx.xx:8848
    # 命名空间ID(注意:这里是ID不是命名空间名)
    namespace: ID
    # 分组
    group: group
     2. 检查前端配置文件中baseUrl配置的是否是用户中心的后端url
window.initSysUrl = function (env) {
  ...
  // baseUrl必须配置为用户中心的后端url,如项目使用了gateway网关,这里的端口是网关的端口
  window.SITE_CONFIG['baseUrl'] =  'http://10.143.28.206:23002/userCenter'
  ...
}
     3. 检查项目是否能够接收到用户中心传递过来的token,可以在permission.js中将接收的token值alert出来(这里因为页面一直来回跳转console打印可能看不到,也可以打断点跟踪)
...
// 以下代码可能因框架版本不同有所差异,但大致都是从to.query中获取token
router.beforeEach(async(to, from, next) => {
  if (to.query.token !== undefined) {
    // 单点登录
    alert(to.query.token)
    $gc.setToken(to.query.token)
  }
...
     4. <br />
  1. SpringBoot架构,应用和用户中心共享同一个token实现单点登录。例如:福建移动低代码平台等。
  2. 接入了多协议
  3. 如福建移动低代码平台,用户中心使用redis缓存存储token信息,项目同样使用redis存储token信息,项目使用jwt方式接入用户中心,jwt配置和用户中心jwt配置保持一致,认证依然还是在自己项目里进行认证,只是登录使用用户中心的登录页。这种方式接入的用户中心,出现标题所示问题时,排查项目中是否正确的改成了redis分布式存储,jwt配置、redis配置是否和用户中心的配置保持了一致。
  4. 同样使用的jwt方式接入用户中心,但是jwt的存储方式的是无状态,此时需要检查jwt配置是否一致
  5. 如集团综调,分布式方式接入用户中心,后端使用nacos服务注册,使用feign方式请求用户中心认证token方式,此时出现标题所示问题时,检查项目中bootstrap.yaml配置文件中的nacos配置是否和用户中心的nacos保持一致