重构改名 PastToken -> LowerClientToken

This commit is contained in:
click33
2024-08-25 20:00:05 +08:00
parent beb958f274
commit 60b7c9036f
8 changed files with 61 additions and 59 deletions

View File

@@ -82,7 +82,7 @@
<h3>模式四凭证式Client Credentials</h3>
<p class="pst">以上三种模式获取的都是用户的 Access-Token代表用户对第三方应用的授权在OAuth2.0中还有一种针对 Client级别的授权
Client-Token代表应用自身的资源授权</p>
<p class="pst">Client-Token具有延迟作废特性在每次获取最新Client-Token的时候旧Client-Token不会立即过期而是作为Past-Token再次
<p class="pst">Client-Token具有延迟作废特性在每次获取最新Client-Token的时候旧Client-Token不会立即过期而是作为Lower-Client-Token再次
储存起来资源请求方只要携带其中之一便可通过Token校验这种特性保证了在大量并发请求时不会出现“新旧Token交替造成的授权失效”
保证了服务的高可用</p>

View File

@@ -60,8 +60,8 @@ public class SaOAuth2ServerConfig implements Serializable {
/** Client-Token 保存的时间(单位:秒) 默认两个小时 */
public long clientTokenTimeout = 60 * 60 * 2;
/** Past-Client-Token 保存的时间(单位:秒) 默认为 -1代表延续 Client-Token 有效期 */
public long pastClientTokenTimeout = -1;
/** Lower-Client-Token 保存的时间(单位:秒) 默认为 -1代表延续 Client-Token 有效期 */
public long lowerClientTokenTimeout = -1;
/** 默认 openid 生成算法中使用的摘要前缀 */
public String openidDigestPrefix = SaOAuth2Consts.OPENID_DEFAULT_DIGEST_PREFIX;
@@ -228,18 +228,18 @@ public class SaOAuth2ServerConfig implements Serializable {
}
/**
* @return pastClientTokenTimeout
* @return lowerClientTokenTimeout
*/
public long getPastClientTokenTimeout() {
return pastClientTokenTimeout;
public long getLowerClientTokenTimeout() {
return lowerClientTokenTimeout;
}
/**
* @param pastClientTokenTimeout 要设置的 pastClientTokenTimeout
* @param lowerClientTokenTimeout 要设置的 lowerClientTokenTimeout
* @return 对象自身
*/
public SaOAuth2ServerConfig setPastClientTokenTimeout(long pastClientTokenTimeout) {
this.pastClientTokenTimeout = pastClientTokenTimeout;
public SaOAuth2ServerConfig setLowerClientTokenTimeout(long lowerClientTokenTimeout) {
this.lowerClientTokenTimeout = lowerClientTokenTimeout;
return this;
}
@@ -379,7 +379,7 @@ public class SaOAuth2ServerConfig implements Serializable {
", accessTokenTimeout=" + accessTokenTimeout +
", refreshTokenTimeout=" + refreshTokenTimeout +
", clientTokenTimeout=" + clientTokenTimeout +
", pastClientTokenTimeout=" + pastClientTokenTimeout +
", lowerClientTokenTimeout=" + lowerClientTokenTimeout +
", openidDigestPrefix='" + openidDigestPrefix +
", higherScope='" + higherScope +
", lowerScope='" + lowerScope +

View File

@@ -23,10 +23,13 @@ import cn.dev33.satoken.oauth2.data.model.AccessTokenModel;
import cn.dev33.satoken.oauth2.data.model.ClientTokenModel;
import cn.dev33.satoken.oauth2.data.model.CodeModel;
import cn.dev33.satoken.oauth2.data.model.RefreshTokenModel;
import cn.dev33.satoken.oauth2.data.model.loader.SaClientModel;
import cn.dev33.satoken.util.SaFoxUtil;
import java.util.List;
import static cn.dev33.satoken.oauth2.template.SaOAuth2Util.checkClientModel;
/**
* Sa-Token OAuth2 数据持久层
*
@@ -126,20 +129,20 @@ public interface SaOAuth2Dao {
}
/**
* 持久化:Past-Token-索引
* 持久化:Lower-Client-Token 索引
* @param ct /
*/
default void savePastTokenIndex(ClientTokenModel ct) {
default void saveLowerClientTokenIndex(ClientTokenModel ct) {
if(ct == null) {
return;
}
long ttl = ct.getExpiresIn();
// TODO PastToken ttl 是否有必要单独配置个字段?
// SaClientModel cm = checkClientModel(ct.clientId);
// if (cm.getPastClientTokenTimeout() != -1) {
// ttl = cm.getPastClientTokenTimeout();
// }
getSaTokenDao().set(splicingPastTokenIndexKey(ct.clientId), ct.clientToken, ttl);
// 如果此 client 单独配置了 Lower-Client-Token 的 TTL则使用单独配置
SaClientModel cm = checkClientModel(ct.clientId);
if (cm.getLowerClientTokenTimeout() != -1) {
ttl = cm.getLowerClientTokenTimeout();
}
getSaTokenDao().set(splicingLowerClientTokenIndexKey(ct.clientId), ct.clientToken, ttl);
}
/**
@@ -248,20 +251,20 @@ public interface SaOAuth2Dao {
}
/**
* 删除:Past-Token
* @param pastToken 值
* 删除:Lower-Client-Token
* @param lowerClientToken 值
*/
default void deletePastToken(String pastToken) {
default void deleteLowerClientToken(String lowerClientToken) {
// 其实就是删除 ClientToken
deleteClientToken(pastToken);
deleteClientToken(lowerClientToken);
}
/**
* 删除:Past-Token索引
* 删除:Lower-Client-Token索引
* @param clientId 应用id
*/
default void deletePastTokenIndex(String clientId) {
getSaTokenDao().delete(splicingPastTokenIndexKey(clientId));
default void deleteLowerClientTokenIndex(String clientId) {
getSaTokenDao().delete(splicingLowerClientTokenIndexKey(clientId));
}
/**
@@ -372,12 +375,12 @@ public interface SaOAuth2Dao {
}
/**
* 获取:Past-Token Value
* 获取:Lower-Client-Token Value
* @param clientId 应用id
* @return .
*/
default String getPastTokenValue(String clientId) {
return getSaTokenDao().get(splicingPastTokenIndexKey(clientId));
default String getLowerClientTokenValue(String clientId) {
return getSaTokenDao().get(splicingLowerClientTokenIndexKey(clientId));
}
/**
@@ -482,12 +485,12 @@ public interface SaOAuth2Dao {
}
/**
* 拼接keyPast-Token 索引
* 拼接keyLower-Client-Token 索引
* @param clientId clientId
* @return key
*/
default String splicingPastTokenIndexKey(String clientId) {
return getSaTokenConfig().getTokenName() + ":oauth2:past-token-index:" + clientId;
default String splicingLowerClientTokenIndexKey(String clientId) {
return getSaTokenConfig().getTokenName() + ":oauth2:lower-client-token-index:" + clientId;
}
/**

View File

@@ -204,17 +204,17 @@ public class SaOAuth2DataGenerateDefaultImpl implements SaOAuth2DataGenerate {
SaOAuth2Dao dao = SaOAuth2Manager.getDao();
// 1、删掉旧 Past-Token
dao.deleteClientToken(dao.getPastTokenValue(clientId));
// 1、删掉旧 Lower-Client-Token
dao.deleteClientToken(dao.getLowerClientTokenValue(clientId));
// 2、将旧Client-Token 标记为新 Past-Token
// 2、将旧Client-Token 标记为新 Lower-Client-Token
ClientTokenModel oldCt = dao.getClientToken(dao.getClientTokenValue(clientId));
dao.savePastTokenIndex(oldCt);
dao.saveLowerClientTokenIndex(oldCt);
// 2.5、如果配置了 PastClientToken 的 ttl ,则需要更新一下
// 2.5、如果配置了 Lower-Client-Token 的 ttl ,则需要更新一下
SaClientModel cm = SaOAuth2Manager.getDataLoader().getClientModelNotNull(clientId);
if(oldCt != null && cm.getPastClientTokenTimeout() != -1) {
oldCt.expiresTime = System.currentTimeMillis() + (cm.getPastClientTokenTimeout() * 1000);
if(oldCt != null && cm.getLowerClientTokenTimeout() != -1) {
oldCt.expiresTime = System.currentTimeMillis() + (cm.getLowerClientTokenTimeout() * 1000);
dao.saveClientToken(oldCt);
}

View File

@@ -70,8 +70,8 @@ public class SaClientModel implements Serializable {
/** 单独配置此ClientClient-Token 保存的时间(单位秒) [默认取全局配置] */
public long clientTokenTimeout;
/** 单独配置此ClientPast-Client-Token 保存的时间(单位:秒) [默认取全局配置] */
public long pastClientTokenTimeout;
/** 单独配置此ClientLower-Client-Token 保存的时间(单位:秒) [默认取全局配置] */
public long lowerClientTokenTimeout;
public SaClientModel() {
@@ -80,7 +80,7 @@ public class SaClientModel implements Serializable {
this.accessTokenTimeout = config.getAccessTokenTimeout();
this.refreshTokenTimeout = config.getRefreshTokenTimeout();
this.clientTokenTimeout = config.getClientTokenTimeout();
this.pastClientTokenTimeout = config.getPastClientTokenTimeout();
this.lowerClientTokenTimeout = config.getLowerClientTokenTimeout();
}
public SaClientModel(String clientId, String clientSecret, List<String> contractScopes, List<String> allowRedirectUris) {
super();
@@ -236,18 +236,18 @@ public class SaClientModel implements Serializable {
}
/**
* @return 此ClientPast-Client-Token 保存的时间(单位:秒) [默认取全局配置]
* @return 此ClientLower-Client-Token 保存的时间(单位:秒) [默认取全局配置]
*/
public long getPastClientTokenTimeout() {
return pastClientTokenTimeout;
public long getLowerClientTokenTimeout() {
return lowerClientTokenTimeout;
}
/**
* @param pastClientTokenTimeout 单独配置此ClientPast-Client-Token 保存的时间(单位:秒) [默认取全局配置]
* @param lowerClientTokenTimeout 单独配置此ClientLower-Client-Token 保存的时间(单位:秒) [默认取全局配置]
* @return 对象自身
*/
public SaClientModel setPastClientTokenTimeout(long pastClientTokenTimeout) {
this.pastClientTokenTimeout = pastClientTokenTimeout;
public SaClientModel setLowerClientTokenTimeout(long lowerClientTokenTimeout) {
this.lowerClientTokenTimeout = lowerClientTokenTimeout;
return this;
}
@@ -265,7 +265,7 @@ public class SaClientModel implements Serializable {
", accessTokenTimeout=" + accessTokenTimeout +
", refreshTokenTimeout=" + refreshTokenTimeout +
", clientTokenTimeout=" + clientTokenTimeout +
", pastClientTokenTimeout=" + pastClientTokenTimeout +
", lowerClientTokenTimeout=" + lowerClientTokenTimeout +
'}';
}

View File

@@ -628,17 +628,17 @@ public class SaOAuth2Template {
}
/**
* 回收 PastToken根据索引 clientId
* 回收 Lower-Client-Token根据索引 clientId
*
* @param clientId /
*/
public void revokePastTokenByIndex(String clientId) {
public void revokeLowerClientTokenByIndex(String clientId) {
SaOAuth2Dao dao = SaOAuth2Manager.getDao();
// 删 pastToken
String pastToken = dao.getPastTokenValue(clientId);
if(pastToken != null) {
dao.deletePastToken(pastToken);
dao.deletePastTokenIndex(clientId);
// 删 Lower-Client-Token
String lowerClientToken = dao.getLowerClientTokenValue(clientId);
if(lowerClientToken != null) {
dao.deleteLowerClientToken(lowerClientToken);
dao.deleteLowerClientTokenIndex(clientId);
}
}

View File

@@ -318,12 +318,12 @@ public class SaOAuth2Util {
}
/**
* 回收 PastToken根据索引 clientId
* 回收 Lower-Client-Token根据索引 clientId
*
* @param clientId /
*/
public static void revokePastTokenByIndex(String clientId) {
SaOAuth2Manager.getTemplate().revokePastTokenByIndex(clientId);
public static void revokeLowerClientTokenByIndex(String clientId) {
SaOAuth2Manager.getTemplate().revokeLowerClientTokenByIndex(clientId);
}
}

View File

@@ -19,7 +19,6 @@ import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.util.SaFoxUtil;
import org.noear.snack.ONode;
//todo: 不能删;为保持与旧的序列化兼容
/**
* Snack3 定制版 SaSession重写类型转换API
*