将JdbcTokenStore用于JWT

时间:2017-12-05 21:27:40

标签: 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);
    }
}

我想开始在数据库而不是内存中存储这些刷新令牌。 Spring为我们提供了JdbcTokenStore,但如果我扩展该类,那么我无法在构造函数中设置JwtAccessTokenConverter。我知道我可以实现自己保存/检索JWT的方法,但我想利用JdbcTokenStore提供的https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql架构的开箱即用支持。

create table oauth_refresh_token (
  token_id VARCHAR(256),
  token LONGVARBINARY,
  authentication LONGVARBINARY
); 

Spring是否支持在数据源中存储JWT?我需要像“JwtJdbcTokenStore”这样的东西。有什么好办法可以做到这一点,但仍然使用JdbcTokenStore的预定义查询和操作?

1 个答案:

答案 0 :(得分:2)

不,Spring不支持这一点。请参阅此主题 https://github.com/spring-projects/spring-security-oauth/issues/687

持久的JWT令牌是无关紧要的,因为JWT令牌是自包含的,您需要知道的所有内容都已在该令牌中可用。

话虽如此,如果你需要持久化它们,那么你必须为它们编写自定义逻辑。