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();
}
}