0

Я использую Монго пользовательских tokenStore и codeService:spring custom mongo TokenStore не обновляет новый access_token автоматически, когда старый истек?

это мой обычай mongoTokenStore:

public class MongoTokenStore implements TokenStore { 

    private final MongoAccessTokenRepository mongoAccessTokenRepository; 
    private final MongoRefreshTokenRepository mongoRefreshTokenRepository; 
    private AuthenticationKeyGenerator authenticationKeyGenerator = 
      new DefaultAuthenticationKeyGenerator(); 

    public MongoTokenStore(MongoAccessTokenRepository mongoAccessTokenRepository, MongoRefreshTokenRepository mongoRefreshTokenRepository) { 
     this.mongoAccessTokenRepository = mongoAccessTokenRepository; 
     this.mongoRefreshTokenRepository = mongoRefreshTokenRepository; 
    } 


    @Override 
    public OAuth2Authentication readAuthentication(OAuth2AccessToken oAuth2AccessToken) { 
     return readAuthentication(oAuth2AccessToken.getValue()); 
    } 

    @Override 
    public OAuth2Authentication readAuthentication(String tokenId) { 
     return mongoAccessTokenRepository.findByTokenId(tokenId) 
       .map(MongoAccessToken::getAuthentication) 
       .orElse(null); 
    } 

    @Override 
    public void storeAccessToken(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) { 

     MongoAccessToken mongoAccessToken = new MongoAccessToken(oAuth2AccessToken, oAuth2Authentication, 
       authenticationKeyGenerator.extractKey(oAuth2Authentication)); 
     mongoAccessTokenRepository.save(mongoAccessToken); 
    } 

    @Override 
    public OAuth2AccessToken readAccessToken(String tokenValue) { 
     return mongoAccessTokenRepository.findByTokenId(tokenValue) 
       .map(MongoAccessToken::getOAuth2AccessToken) 
       .orElse(null); 
    } 

    @Override 
    public void removeAccessToken(OAuth2AccessToken oAuth2AccessToken) { 
     mongoAccessTokenRepository.findByTokenId(oAuth2AccessToken.getValue()) 
       .ifPresent(mongoAccessTokenRepository::delete); 
    } 

    @Override 
    public void storeRefreshToken(OAuth2RefreshToken oAuth2RefreshToken, OAuth2Authentication oAuth2Authentication) { 
     MongoRefreshToken token=new MongoRefreshToken(oAuth2RefreshToken,oAuth2Authentication); 
     mongoRefreshTokenRepository.save(token); 

    } 

    @Override 
    public OAuth2RefreshToken readRefreshToken(String tokenValue) { 
     return mongoRefreshTokenRepository.findByTokenId(tokenValue) 
       .map(MongoRefreshToken::getOAuth2RefreshToken) 
       .orElse(null); 
    } 

    @Override 
    public OAuth2Authentication readAuthenticationForRefreshToken(OAuth2RefreshToken oAuth2RefreshToken) { 

     return mongoRefreshTokenRepository.findByTokenId(oAuth2RefreshToken.getValue()) 
       .map(MongoRefreshToken::getAuthentication) 
       .orElse(null); 
    } 

    @Override 
    public void removeRefreshToken(OAuth2RefreshToken oAuth2RefreshToken) { 
     mongoRefreshTokenRepository.findByTokenId(oAuth2RefreshToken.getValue()) 
       .ifPresent(mongoRefreshTokenRepository::delete); 
    } 

    @Override 
    public void removeAccessTokenUsingRefreshToken(OAuth2RefreshToken oAuth2RefreshToken) { 

     mongoAccessTokenRepository.findByRefreshToken(oAuth2RefreshToken.getValue()) 
       .ifPresent(mongoAccessTokenRepository::delete); 
    } 

    @Override 
    public OAuth2AccessToken getAccessToken(OAuth2Authentication oAuth2Authentication) { 

     return mongoAccessTokenRepository.findByAuthenticationId(authenticationKeyGenerator 
       .extractKey(oAuth2Authentication)) 
       .map(MongoAccessToken::getOAuth2AccessToken) 
       .orElse(null); 
    } 

    @Override 
    public Collection<OAuth2AccessToken> findTokensByClientIdAndUserName(String s, String s1) { 

     return mongoAccessTokenRepository.findByClientIdAndUserName(s,s1) 
       .stream() 
       .map(MongoAccessToken::getOAuth2AccessToken) 
       .collect(Collectors.toList()); 
    } 

    @Override 
    public Collection<OAuth2AccessToken> findTokensByClientId(String s) { 
     return mongoAccessTokenRepository.findByClientId(s) 
       .stream() 
       .map(MongoAccessToken::getOAuth2AccessToken) 
       .collect(Collectors.toList()); 
    } 
} 

и это мой заказ mongoCodeService:

@Component 
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) 
public class MongoAuthenticationCodeService extends RandomValueAuthorizationCodeServices{ 

    private final MongoAuthenticationCodeRepository repository; 

    @Override 
    protected void store(String code, OAuth2Authentication oAuth2Authentication) { 

     repository.save(new MongoAuthenticationCode(code,oAuth2Authentication)); 
    } 

    @Override 
    protected OAuth2Authentication remove(String code) { 

     return repository.findOneByCode(code) 
       .map(MongoAuthenticationCode::getAuthentication) 
       .orElse(null); 
    } 
} 

и мой OAuth2Config:

проблема:

Я могу войти с весеннего zuul ui-server на «authorization_code» и может получить доступ к данным ResourceServer.

Но когда access_token истек (120s), а также повторно получать данные ResourceServer, я вижу mongoTokenStore Убрано существовало access_token, но почему бы не обновить новую access_token автоматически?

Как это решить?

ответ

0

Весь смысл токена обновления - добавить еще одно измерение безопасности в OAuth2.

Когда конечный пользователь приобрел токен доступа, он теперь может получить доступ к любому ресурсу в рамках правил авторизации, которые его награждает.

Если его токен доступа каким-то образом украден, злоумышленник может теперь получить доступ к любому ресурсу, который авторизует его токен доступа, но если мы установим время истечения срока доступа для токена доступа, у злоумышленника будет ограниченное время доступа.

С учетом сказанного, если весна oauth2 автоматически обновит этот токен, что еще один аспект безопасности не будет применен, и вся идея обновления токена будет потрачена впустую.

Таким образом, в заключение, вы несете ответственность за то, чтобы ваш конечный пользователь снова авторизовался через OAuth2.

Вы также можете прочитать:

Why Does OAuth v2 Have Both Access and Refresh Tokens?

+0

спасибо ваш ответ, я знаю правила, Можете ли вы дать мне несколько советов о том, как реализуется с пользовательскими ** MongoTokenStore (authorization_code типа гранта) ** –

Смежные вопросы