将 JdbcTokenStore 用于 JWT

iMa*_*kre 2 spring spring-oauth2

对于我的 REST API,我使用 JWT 进行 OAuth2 授权。目前我正在扩展JwtTokenStore以将刷新令牌存储在内存中,以便我能够撤销它们。

// TODO: This is a temporary in memory solution that needs to be replaced with a concrete persistent implementation.
public class MyJwtTokenStore extends JwtTokenStore {

    private List<OAuth2RefreshToken> refreshTokens;

    public MyJwtTokenStore(JwtAccessTokenConverter jwtTokenEnhancer) {
        super(jwtTokenEnhancer);
        refreshTokens = new ArrayList<>();
    }

    @Override
    public OAuth2RefreshToken readRefreshToken(String tokenValue) {
        OAuth2RefreshToken refreshToken = super.readRefreshToken(tokenValue);
        if (!refreshTokens.contains(refreshToken)) {
            throw new InvalidGrantException("Invalid refresh token: " + tokenValue);
        }
        return refreshToken;
    }

    @Override
    public void storeRefreshToken(OAuth2RefreshToken refreshToken, OAuth2Authentication authentication) {
        refreshTokens.add(refreshToken);
    }

    @Override
    public void removeRefreshToken(OAuth2RefreshToken token) {
        refreshTokens.remove(token);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想开始将这些刷新令牌存储在数据库中而不是内存中。Spring 为我们提供了JdbcTokenStore,但是如果我扩展该类,那么我将无法JwtAccessTokenConverter在构造函数中设置 a 。我知道我可以实现我自己的保存/检索 JWT 的方法,但我想利用https://github.com/spring-projects/spring-security- 上对架构的开箱即用支持的OAuth /斑点/主/弹簧安全的oauth2 / SRC /测试/资源/ schema.sql文件其中JdbcTokenStore提供。

create table oauth_refresh_token (
  token_id VARCHAR(256),
  token LONGVARBINARY,
  authentication LONGVARBINARY
); 
Run Code Online (Sandbox Code Playgroud)

Spring 是否支持将 JWT 存储在数据源中?我需要类似“JwtJdbcTokenStore”的东西。这样做的好方法是什么,但仍然使用预定义的查询和操作JdbcTokenStore

Chi*_*ids 9

不,Spring 不支持这个。请参阅此线程 https://github.com/spring-projects/spring-security-oauth/issues/687

持久化 JWT 令牌无关紧要,因为 JWT 令牌是自包含的,您需要知道的一切都已经在该令牌中可用。

话虽如此,如果您需要持久化它们,那么您将不得不为此编写自定义逻辑。