package auth; import auth.models.Token; import com.avaje.ebean.Ebean; import service.PoseidonService; import java.util.Date; public class OAuth2RefreshTokenAuthenticator extends Authenticator { @Override public Token authenticate(Authentication anAuthentication) { if (invalidGrantType(anAuthentication)) { return null; } OAuth2RefreshTokenAuthentication authentication = (OAuth2RefreshTokenAuthentication) anAuthentication; Token previousToken = Token.findByRefreshToken(authentication.getRefreshToken()); if (validateAuthentication(authentication, previousToken)) { expireToken(previousToken); return createToken(previousToken); } else { return null; } } private Token createToken(Token originalToken) { Token newToken = new Token(originalToken.user, GrantType.get(originalToken.grantType)); Ebean.save(newToken); return newToken; } private Token expireToken(Token token) { Date now = new Date(PoseidonService.getNow().toDate().getTime()); token.accessExpires = now; token.refreshExpires = now; Ebean.update(token); return token; } private boolean invalidGrantType(Authentication authentication) { return GrantType.REFRESH_TOKEN != authentication.getGrantType(); } private boolean validateAuthentication(OAuth2RefreshTokenAuthentication authentication, Token token) { return validToken(token); } private boolean validToken(Token token) { return token != null && token.isRefreshTokenActive(); } }