Sa-Token icon indicating copy to clipboard operation
Sa-Token copied to clipboard

微服务 - 内部服务外网隔离问题

Open 15213222722 opened this issue 1 year ago • 2 comments

使用版本:

1.39.0

涉及的功能模块:

sa-token集成网关,[微服务 - 内部服务外网隔离]

  • 我经过以下步骤测试: 网关增加 image 子服务增加 image 查看源码 image image 这里currentToken的判断为空时调用refreshToken方法,但refreshToken方法内部sameToken不为空时才会写入xxx:var:past-same-token到redis,实际上currentToken和sameToken变量获取的值是同一个,这里是否矛盾了?如果currentToken为空,永远都不会写入xxx:var:past-same-token到redis,导致子服务在验证sameToken时,获取的past-same-token为空,子服务校验不通过

  • 得出以下结果: 子服务在验证sameToken时,获取的past-same-token为空,子服务校验不通过

  • 其中第 xx 行的代码输出表现 和文档上描述的不一致:

  • 我的理解是:

请问,是我的理解不对,还是文档出了问题?

15213222722 avatar Dec 04 '24 08:12 15213222722

时间已久,代码具体逻辑我一时半会也理不过来,不过这一块没人反映过逻辑有问题,建议你可以执行一下,执行结果和预期不符的话再追问一下,我再看看

click33 avatar Feb 18 '25 09:02 click33

时间已久,代码具体逻辑我一时半会也理不过来,不过这一块没人反映过逻辑有问题,建议你可以执行一下,执行结果和预期不符的话再追问一下,我再看看

这个逻辑确实存在问题,会导致 pastToken 永远不会写入

第三行

public String getToken() {
	String currentToken = getTokenNh(); 
	if(SaFoxUtil.isEmpty(currentToken)) {
		// 注意这里的自刷新不能做到高并发可用 
		currentToken = refreshToken();
	}
	return currentToken;
}

和第五行

public String refreshToken() {
	
	// 1. 先将当前 Same-Token 写入到 Past-Same-Token 中 
	String sameToken = getTokenNh(); 
	if( ! SaFoxUtil.isEmpty(sameToken)) {
		savePastToken(sameToken, getTokenTimeout());
	}
	
	// 2. 再刷新当前 Same-Token
	String newSameToken = createToken();
	saveToken(newSameToken);
	
	// 3. 返回新的 Same-Token
	return newSameToken;
}

这两个判断导致永远不会有 pastToken 写入

fangzhengjin avatar Aug 13 '25 03:08 fangzhengjin