增加 state 值校验

This commit is contained in:
click33
2024-08-24 20:18:23 +08:00
parent d3b337a6a6
commit e0a609b128
5 changed files with 76 additions and 4 deletions

View File

@@ -158,6 +158,17 @@ public interface SaOAuth2Dao {
}
}
/**
* 持久化state
* @param state /
*/
default void saveState(String state) {
if( ! SaFoxUtil.isEmpty(state)) {
long ttl = SaOAuth2Manager.getServerConfig().getCodeTimeout();
getSaTokenDao().set(splicingStateSaveKey(state), state, ttl);
}
}
// ------------------- delete数据
@@ -262,6 +273,14 @@ public interface SaOAuth2Dao {
getSaTokenDao().delete(splicingGrantScopeKey(clientId, loginId));
}
/**
* 删除state记录
* @param state /
*/
default void deleteGrantScope(String state) {
getSaTokenDao().delete(splicingStateSaveKey(state));
}
// ------------------- get 数据
@@ -372,6 +391,18 @@ public interface SaOAuth2Dao {
return SaOAuth2Manager.getDataConverter().convertScopeStringToList(value);
}
/**
* 获取state
* @param state /
* @return /
*/
default String getState(String state) {
if(SaFoxUtil.isEmpty(state)) {
return null;
}
return getSaTokenDao().get(splicingStateSaveKey(state));
}
// ------------------- 拼接key
@@ -469,6 +500,15 @@ public interface SaOAuth2Dao {
return getSaTokenConfig().getTokenName() + ":oauth2:grant-scope:" + clientId + ":" + loginId;
}
/**
* 拼接keystate 参数持久化
* @param state /
* @return key
*/
default String splicingStateSaveKey(String state) {
return getSaTokenConfig().getTokenName() + ":oauth2:state:" + state;
}
// -------- bean 对象代理

View File

@@ -91,4 +91,10 @@ public interface SaOAuth2DataGenerate {
*/
void revokeAccessToken(String accessToken);
/**
* 检查 state 是否被重复使用
* @param state /
*/
void checkState(String state);
}

View File

@@ -245,6 +245,7 @@ public class SaOAuth2DataGenerateDefaultImpl implements SaOAuth2DataGenerate {
public String buildRedirectUri(String redirectUri, String code, String state) {
String url = SaFoxUtil.joinParam(redirectUri, SaOAuth2Consts.Param.code, code);
if( ! SaFoxUtil.isEmpty(state)) {
checkState(state);
url = SaFoxUtil.joinParam(url, SaOAuth2Consts.Param.state, state);
}
return url;
@@ -261,6 +262,7 @@ public class SaOAuth2DataGenerateDefaultImpl implements SaOAuth2DataGenerate {
public String buildImplicitRedirectUri(String redirectUri, String token, String state) {
String url = SaFoxUtil.joinSharpParam(redirectUri, SaOAuth2Consts.Param.token, token);
if( ! SaFoxUtil.isEmpty(state)) {
checkState(state);
url = SaFoxUtil.joinSharpParam(url, SaOAuth2Consts.Param.state, state);
}
return url;
@@ -291,5 +293,18 @@ public class SaOAuth2DataGenerateDefaultImpl implements SaOAuth2DataGenerate {
dao.deleteRefreshTokenIndex(at.clientId, at.loginId);
}
/**
* 检查 state 是否被重复使用
* @param state /
*/
@Override
public void checkState(String state) {
String value = SaOAuth2Manager.getDao().getState(state);
if(SaFoxUtil.isNotEmpty(value)) {
throw new SaOAuth2Exception("多次请求的 state 不可重复: " + state);
}
SaOAuth2Manager.getDao().saveState(state);
}
}