OAuth-Unterstuetzung fuer jdk.httpserver
Ulrich
2021-11-20 61e11f114804d793042b875098aff2c85cdd7825
loginTimeLimit eingebaut
1 files modified
64 ■■■■ changed files
src/de/uhilger/httpserver/oauth/BearerAuthenticator.java 64 ●●●● patch | view | raw | blame | history
src/de/uhilger/httpserver/oauth/BearerAuthenticator.java
@@ -86,10 +86,15 @@
  private long refreshSeconds;
  
  private long refreshExpire;
  private long lastLoginTime;
  private long loginTimeLimit;
  public BearerAuthenticator() {
    key = Keys.secretKeyFor(SignatureAlgorithm.HS256);  
  }
    lastLoginTime = 0;
  }
  
  @Override
  public Result authenticate(HttpExchange exchange) {
@@ -133,18 +138,39 @@
   * @return Token oder null, wenn die Anmeldung misslang
   */
  public LoginResponse login(HttpExchange e, String userId, String password) {
    if (realm.isValid(userId, password)) {
      logger.info(userId + " logged in from IP." + e.getRemoteAddress());
      LoginResponse r = new LoginResponse();
      String token = createToken(userId, expireSeconds);
      r.setToken(token);
      r.setRefreshToken(createToken(userId, refreshExpire));
      r.setExpiresIn(expireSeconds);
      return r;
    if(canLogin()) {
      if (realm.isValid(userId, password)) {
        logger.info(userId + " logged in from IP." + e.getRemoteAddress());
        LoginResponse r = new LoginResponse();
        String token = createToken(userId, expireSeconds);
        r.setToken(token);
        r.setRefreshToken(createToken(userId, refreshExpire));
        r.setExpiresIn(expireSeconds);
        return r;
      } else {
        logger.info("Invalid log in attempt for " + userId + " from IP " + e.getRemoteAddress());
        return null;
      }
    } else {
      logger.info("Invalid log in attempt for " + userId + " from IP " + e.getRemoteAddress());
      logger.info("Log in attempt for " + userId + " from IP " + e.getRemoteAddress() + " rejected due to time limit.");
      return null;
    }
  }
  private boolean canLogin() {
    boolean doLogin = false;
    if(loginTimeLimit > 0 ) {
      Date now = new Date();
      long nowTimeMillis = now.getTime();
      long diff = nowTimeMillis - lastLoginTime;
      if(loginTimeLimit < diff) {
        lastLoginTime = nowTimeMillis;
        doLogin = true;
      }
    } else {
      doLogin = true;
    }
    return doLogin;
  }
  
  public LoginResponse refresh(String refreshToken) {
@@ -413,4 +439,20 @@
  public void setRefreshExpireSeconds(long seconds) {
    this.refreshExpire = seconds;
  }
  public long getLoginTimeLimit() {
    return loginTimeLimit / 1000;
  }
  /**
   * Anzahl Sekunden, die zwischen einzelnen Logins gewartet werden soll
   *
   * @param loginTimeLimit Wartezeit bis zum nächsten Login in Sekunden,
   * 0 = keine Verzoegerung
   */
  public void setLoginTimeLimit(long loginTimeLimit) {
    this.loginTimeLimit = loginTimeLimit * 1000;
  }
}