关于其他服务器篡改请求头导致登录失效

问题描述

此问题是单点登录转发问题,客户服务器域名访问一个本程序对外接口获取token,并跳转至本系统登录页面,在网关日志中发现token为空的异常。

问题排查

1、拿token在postman中发送,发现请求是成功的,本程序通过nginx代理配置,检查代理配置,经过一番排查没有问题

2、检查程序,也没有问题

3、那么问题就出现在了域名转发上,这个域名转发会篡改请求头的Authorization中的token,导致登录失败,而客这个域名转发是客户服务器,我们改不了,所以只能选择替代方案。

问题解决

替代方案1: 将用户的token放在url中进行拼接,前端修改axios实例,后端修改,如果获取不到请求头中的token,在参数中的取。

此方案弊端很大,第一是token暴露,第二是url参数有限制,某些请求会失败。

替代方案2:自定义请求头,在axios中修改,在后台修改校验取自定义请求头

替代方案1:

java 复制代码
List<String> strings = request.getHeaders().get(userAuthConfig.getTokenHeader());
        String authToken = null;
        if (strings != null && strings.size() > 0) {
            authToken = strings.get(0);
        }
        // 如果为空,则获取参数中的token
        if (StringUtils.isBlank(authToken)) {
            strings = request.getQueryParams().get("token");
            if (strings != null && strings.size() > 0) {
                authToken = strings.get(0);
            }
  }
javascript 复制代码
// axios 拼接token
url.indexOf('?') === -1 ? config.url = url+'?_='+(new Date().getTime()) +"&token="+token: config.url = url+'&_='+(new Date().getTime())+"&token="+token;

替代方案2:

由于取请求头中token为配置项,后台只需修改配置即可,前台需要添加自定义请求头

java 复制代码
public  class UserAuthConfig {

    @Value("${auth.user.token-header}")
    private String tokenHeader;


    public String getTokenHeader() {
        return tokenHeader;
    }

}
XML 复制代码
auth:
  serviceId: wsd-auth-server
  user:
    token-header: Custom-Token
javascript 复制代码
axios.interceptors.request.use(config => {
  
    if (sessionStorage.getItem('token')) {
        // 自定义请求头
        config.headers['Custom-Token'] = sessionStorage.getItem('token');
        if(!config || !config.headers || !config.headers['Content-Type']){
            config.headers['Content-Type'] = 'application/json';
        }
    }

    let url=config.url.trim();
    url.indexOf('?') === -1 ? config.url = url+'?_='+(new Date().getTime()) : config.url = url+'&_='+(new Date().getTime());
    return config;
});
相关推荐
꯭自꯭闭꯭3 小时前
DM主备集群以及读写分离集群搭建
linux·运维·数据库
倔强的石头1063 小时前
【Linux指南】动静态库系列(九):动态库如何进入进程地址空间:从磁盘 .so 到共享内存映射
java·linux·服务器
鬼手点金4 小时前
Claude Code示范案例-进阶学习路径
java·服务器·前端·学习·计算机视觉·前向传播
茉莉玫瑰花茶4 小时前
GO [ 文件 ]
服务器·golang
xbzb4 小时前
Linux iSCSI 存储部署与 CHAP 认证完全指南
linux·服务器·iscsi·chap·共享硬盘
IT大白鼠4 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 5 篇 · 多模态与虚拟化AI 能「看」图:多模态与虚拟化管理
linux·运维·人工智能
奕鼎竜瑆4 小时前
MCP Connectors by Databox 新手部署与调用指南
服务器·人工智能
阿狗童鞋4 小时前
Nginx反向代理与负载均衡实战指南
运维·nginx·负载均衡
IT大白鼠4 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 2 篇 · 安全守规矩的 AI:分级安全管控是灵魂
linux·运维·人工智能
闭包不眠4 小时前
端侧AI能省多少服务器钱:把账换成字节算
运维·服务器·图像处理·人工智能·计算机视觉