JustAuth Illegal state xx问题

排查

  1. 起因
    image.png
    服务上线生产环境后使用飞书登录有些时候会登录失败,查看日志出现以上错误Illegal state [FEISHU],但是测试环境没有出现这个情况

  2. 排查

经过排查发现是JustAuth 报的错
image.png

  1. 分析出现原因

在JustAuth找到出现原因和解决方案
原文地址:异常相关问题 | JustAuth

异常原因

  1. 单机的情况
    • state 默认有效期为3分钟(#AuthCacheConfig.java(opens new window)),第三方回调会开发者服务器后,因为异常原因在3分钟内没有处理回调请求,此时会抛出该异常。
  2. 集群的情况
    • 默认 state 是缓存到 map 中,当开发者的服务为集群时,不同集群间的内存缓存无法共享,抛出该异常。具体异常流程为:有 AB 两台服务器, A 服务器生成授权链接(同时生成 state 并存到 A 服务器的本机内存中),第三方登录完回调到了 B 服务器,此时 B 服务器内存中没有 state 缓存,并且无法访问到 A 服务器的内存。 系统抛出异常。
  3. 内网穿透的情况
    • 服务部署到云端,通过内网穿透到本机。在云端生成授权链接(同时生成 state 并存到云端服务器的内存中),回调请求穿透到本地,异常流程参考上面 “集群情况”。
  4. 前后端分离的情况
    • 项目实现前后端分离,并且生成第三方授权链接时为前端项目自行拼接,未使用 JA 提供的 authorize 方法。JA 在处理 code 换 token 时,默认会校验 state 是否存在,前端自己拼接的链接授权后,即使第三方返回了 state,但因为没有使用 JA 提供的 authorize 方法,所以缓存中并不存在 state,因此会导致验证失败。

解决方案

  • 针对第一种情况,先排查是否存在异常情况,然后具体分析为什么会延迟3分钟(是否本地在进行 DEBUG?是否第三方授权时长时间未点击确认授权)。最后可以适当将AuthCacheConfig.java#timeout(opens new window)参数值调高。
  • 针对第二种情况,建议使用自定义state缓存
  • 针对第三种情况,可临时将 AuthConfig.java#ignoreCheckState(opens new window)参数设为 true,待测试完成后,再将配置修改回来(建议仅本地测试使用,如需上线,不建议将ignoreCheckState设为 true)
  • 针对第四种情况,可将 AuthConfig.java#ignoreCheckState(opens new window)参数设为 true(仅此情况下,才建议将ignoreCheckState设为 true)
  • 如果不属于以上情况,另外还可以使用临时解决方案:将 AuthConfig.java#ignoreCheckState(opens new window)参数设为 true。至于为何将该条标注为【不建议】,请参考下图:

  1. 结合异常原因分析本次生产出现这个异常的原因
  • 我们的测试环境是单台机器所以不会出现这个问题
  • 我们这个服务在生产部署了2个
  • 所以异常原因是集群导致的state异常
  1. 解决方案
  • 快速临时解决方案: 停掉一个服务(快速解决问题,让服务可用)
  • 集群解决方案:自定义state缓存

JustAuth 自定义state缓存(redis缓存)

  1. 添加redis依赖
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 添加redis配置
# 集成redis实现自定义的state缓存
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=xxxx
  1. 实现state缓存接口
package me.zhyd.justauth;

import me.zhyd.oauth.cache.AuthCacheConfig;
import me.zhyd.oauth.cache.AuthStateCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;

/**
 * 扩展Redis版的state缓存
 *
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
 * @version 1.0
 * @date 2019/10/24 13:38
 * @since 1.8
 */
@Component
public class AuthStateRedisCache implements AuthStateCache {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private ValueOperations<String, String> valueOperations;

    @PostConstruct
    public void init() {
        valueOperations = redisTemplate.opsForValue();
    }

    /**
     * 存入缓存,默认3分钟
     *
     * @param key   缓存key
     * @param value 缓存内容
     */
    @Override
    public void cache(String key, String value) {
        valueOperations.set(key, value, AuthCacheConfig.timeout, TimeUnit.MILLISECONDS);
    }

    /**
     * 存入缓存
     *
     * @param key     缓存key
     * @param value   缓存内容
     * @param timeout 指定缓存过期时间(毫秒)
     */
    @Override
    public void cache(String key, String value, long timeout) {
        valueOperations.set(key, value, timeout, TimeUnit.MILLISECONDS);
    }

    /**
     * 获取缓存内容
     *
     * @param key 缓存key
     * @return 缓存内容
     */
    @Override
    public String get(String key) {
        return valueOperations.get(key);
    }

    /**
     * 是否存在key,如果对应key的value值已过期,也返回false
     *
     * @param key 缓存key
     * @return true:存在key,并且value没过期;false:key不存在或者已过期
     */
    @Override
    public boolean containsKey(String key) {
        return redisTemplate.hasKey(key);
    }
}
  1. 获取Request(以飞书为例)
// 1. 注入新添加的cache
@Autowired
private AuthStateRedisCache stateRedisCache;

// 2. 创建request时传入stateRedisCache
AuthRequest authRequest = new AuthFeishuRequest(AuthConfig.builder()
      .clientId("clientId")
      .clientSecret("clientSecret")
      .redirectUri("redirectUri")
      .build(), stateRedisCache);// 此处传入自定义实现的类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/687552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mat的lambda方式像素高效遍历(C++11)

Mat的lambda方式像素高效遍历&#xff08;C11&#xff09; 文章目录 Mat的lambda方式像素高效遍历&#xff08;C11&#xff09;前言一、Mat的lambda方式像素高效遍历二、代码实现总结 前言 图像遍历是图像处理中的经典操作&#xff0c;快速高效的进行像素遍历对性能的提升至关…

建构信任基石:揭秘Web3的去中心化信任体系

在传统的互联网时代&#xff0c;信任往往建立在中心化的机构和第三方平台之上&#xff0c;而这种中心化的信任体系往往面临着数据泄露、信息滥用等问题。然而&#xff0c;随着区块链技术的发展&#xff0c;Web3时代正在向我们展示一种全新的信任体系&#xff0c;即去中心化的信…

随到随学|2024泰迪智能科技暑期在线项目/集训营

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

vCenter7.0安装部署

vCenter7.0安装部署 一、准备环境二、创建新的虚拟机1.创建虚拟机2.第3-5步可直接默认安装并同意许可协议。3.其他设置4.第一阶段直接点完成即可 三、进入第二阶段安装&#xff08;输入ip&#xff1a;5480进入安装界面&#xff09; 一、准备环境 准备一台exsi&#xff0c;并登…

《数学学习与研究》投稿难度大吗?

《数学学习与研究》杂志的投稿难度相对适中。 一方面&#xff0c;它作为一本有一定影响力的数学专业期刊&#xff0c;对稿件的质量有一定要求。论文需要具备一定的创新性、科学性和逻辑性&#xff0c;研究内容要具有一定的价值和深度。 另一方面&#xff0c;与一些核心期刊相…

Lab_ Exploiting a mass assignment vulnerability_实验室:利用大规模分配漏洞

使用 wiener:peter 登录 点击轻量级“l33t”皮夹克产品并将其添加到购物篮中。 去到购物车&#xff0c;点击下单&#xff0c;提示Not enough store credit for this purchase&#xff08;没有足够的商店信用用于此次购买&#xff09; 在Burp的HTTP历史记录中发现了API的请求…

QT creator c动态链接库的创建与调用

QT creator c动态链接库的创建与调用 QT5.15.2 1.创建dll项目 确保两类型选择正确 2.选择MinGW 64-bit 3.点击完成 pro文件参考&#xff1a; QT - guiTEMPLATE lib DEFINES QT_DLL_DEMO_LIBRARYCONFIG c17# You can make your code fail to compile if it uses deprecat…

网线制作(双绞线+水晶头)——T568B标准

参考视频&#xff1a;https://www.bilibili.com/video/BV1KQ4y1i7zP/ 1、使用剥线器 2、将线捋顺、排序、剪掉牵引线 记忆技巧 1.线序颜色整体是一浅一深 2.颜色顺序是黄、蓝、绿、棕 一个黄种人、从上向下看&#xff0c;分别看到的是蓝天、青草(绿)、泥土(棕色) 3.中间两根浅…

抗锯齿技术在AI绘画中的应用与意义

随着人工智能技术的飞速发展&#xff0c;AI绘画逐渐成为艺术创作领域的一大热点。然而&#xff0c;在数字绘画的过程中&#xff0c;画面的锯齿效应一直是影响作品质量的一个重要因素。抗锯齿技术的应用&#xff0c;有效地解决了这一问题&#xff0c;使得AI绘画作品更加细腻、真…

自然语言处理(NLP)—— 主题建模

1. 主题建模的概念 主题建模&#xff08;Topic Modeling&#xff09;是一种用于发现文档集合&#xff08;语料库&#xff09;中的主题&#xff08;或称为主题、议题、概念&#xff09;的统计模型。在自然语言处理和文本挖掘领域&#xff0c;主题建模是理解和提取大量文本数据隐…

小程序 UI 风格魅力非凡

小程序 UI 风格魅力非凡

MK米客方德 SD NAND与文件系统:技术解析与应用指南

随着数字存储技术的飞速发展&#xff0c;SD NAND(贴片式T卡&#xff09;已成为我们日常生活中不可或缺的存储工具。我们将深入探讨SD NAND的文件系统&#xff0c;特别是SD 3.0协议支持的文件系统类型&#xff0c;以及它们在实际应用中的作用和用户可能遇到的问题。 MK米客方德的…

跨境反向海淘系统:业务流程解析与未来发展展望

随着全球化的深入发展和互联网技术的飞速进步&#xff0c;跨境购物已经成为越来越多消费者日常生活中的一部分。在这个过程中&#xff0c;反向海淘系统以其独特的优势&#xff0c;逐渐崭露头角&#xff0c;成为跨境电商领域的新星。作为一名在跨境反向海淘系统业务中耕耘了10年…

Python中的pathlib和Path(面向对象的文件系统路径操作库)

1. pathlib库介绍 1.1 pathlib和pathlib.Path pathlib是Python标准库中的一个模块&#xff0c;它提供了一组面向对象的文件系统路径操作。在Python早期版本中&#xff0c;文件和目录路径通常使用字符串来处理&#xff0c;或者使用os.path模块中的函数来执行操作&#xff0c;如…

域内攻击 -----> Kerberoasting

在域中&#xff0c;能拿到账户信息得攻击基本上有四个 域内用户枚举域内密码喷洒KerberoastingAS-REP Roasting 对于AS-REP Roasting&#xff0c;我们下一篇文章讲&#xff0c;而前两个&#xff0c;请参考我以前域内横向移动得文章。 那么我们今天就来聊聊Kerberoasting 1.S…

CodeFlying:一个可以用自然语言开发软件的AI平台

前言&#xff1a; AI可以生成文字、图片、代码、甚至视频&#xff0c;但是你听说过AI可以直接生成软件的吗&#xff1f;码上飞CodeFlying是一个可以用自然语言开发软件的平台&#xff0c;彻底改变软件开发的方式&#xff0c;让所有人都可以成为应用的创作者&#xff01; 你最关…

基于ChatGLM3的本地问答机器人部署流程

基于ChatGLM3的本地问答机器人部署流程 前言一、确定文件结构1.新建文件夹储存本地模型2.下载源码和模型 二、Anaconda环境搭建1.创建anaconda环境2.安装相关库3.设置本地模型路径4.启动 三、构建本地知识库1.下载并安装postgresql2.安装c库3.配置向量插件 四、线上运行五、 全…

计算机网络-NAT配置与ACL

目录 一、ACL 1、ACL概述 2、ACL的作用 3、ACL的分类 4、ACL的配置格式 二、NAT 1、NAT概述 2、NAT分类 2.1 、 静态NAT 2.2 、 动态NAT 3、NAT的功能 4、NAT的工作原理 三、NAT配置 1、静态NAT配置 2、动态NAT配置 四、总结 一、ACL 1、ACL概述 ACL&#xff…

springboot文具销售管理系统-计算机毕业设计源码70886

摘要 从上世纪末到目前&#xff0c;计算机科学技术已经被尝试应用在各个职业各个领域&#xff0c;在商业贸易上&#xff0c;使用比重较高。计算机科学技术包括软件技术、网络技术、硬件技术等&#xff0c;越来越多的商家使用计算机来进行营业&#xff0c;出售、收购、宣传各类商…

LinkedList详解(含数据结构动画演示)

目录 LinkedList详解1、LinkedList的继承体系2、LinkedList的构造函数3、LinkedList的add(E e)方法4、LinkedList的Node节点5、双向链表的概念和Node节点的详细解释6、LinkedList的add(E e)方法梳理7、LinkedList的getXXX方法8、LinkedList的removeXXX方法①、removeFirst()方法…