implemented otp login

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2025-07-08 20:27:34 +02:00
parent 7a5bb50ee2
commit 92c6b154ea
11 changed files with 99 additions and 34 deletions

View File

@@ -18,6 +18,6 @@ public class Paths {
public static final String OPENID_LOGIN = "openid_login";
public static final String RESET_PW = "reset_pw";
public static final String SESSION = "session";
public static final String VALIDATE_TOKEN = "validateToken";
public static final String VALIDATE_TOKEN = "validate";
public static final String WHOAMI = "whoami";
}

View File

@@ -158,6 +158,7 @@ public class UserModule extends BaseHandler {
case LIST: return getUserList(ex, user);
case LOGOUT: return logout(ex, sessionToken);
case OIDC: return getOIDC(ex,user,path);
case VALIDATE_TOKEN: return validateToken(ex,path.pop());
case WHOAMI: return getUser(ex, user);
};
@@ -477,12 +478,13 @@ public class UserModule extends BaseHandler {
tokenMap.put(email,token);
var subject = "user.your_password_reset_token";
var content = "user.go_to_url_to_reset_password";
var fills = Map.of("token",token);
var url = url(ex).replace("/api/user/reset_pw","/user/reset/pw")+"?token="+token;
var fills = Map.of("url",url);
var message = new Message(user,subject,content,fills,null);
var envelope = new Envelope(message,user);
messages.send(envelope);
} catch (UmbrellaException e){
return send(ex,e);
}
return sendEmptyResponse(HTTP_OK,ex);
}
@@ -540,6 +542,21 @@ public class UserModule extends BaseHandler {
return sendContent(ex,HTTP_OK,saved);
}
private boolean validateToken(HttpExchange ex, String token) throws IOException {
if (token == null) return sendContent(ex,HTTP_UNPROCESSABLE,"No token provided!");
var email = tokenMap.get(token);
tokenMap.remove(token);
if (email == null) return sendContent(ex,HTTP_UNAUTHORIZED,"Unknown token!");
try {
var user = users.load(new EmailAddress(email));
users.getSession(user).cookie().addTo(ex);
return sendContent(ex,user);
} catch (UmbrellaException e) {
return send(ex,e);
}
}
private String verifyAndGetUserId(String jwt, State state) throws UmbrellaException {
var jwksEndpoint = state.config.getString(JWKS_ENDPOINT);
var audience = state.loginService.clientId();

View File

@@ -511,7 +511,7 @@ CREATE TABLE IF NOT EXISTS {0} (
);
}
private DbUser toUser(ResultSet rs) throws SQLException {
private DbUser toUser(ResultSet rs) throws SQLException, UmbrellaException {
long id = rs.getLong(ID);
Set<DbUser.PERMISSION> perms = id == 1 ? ADMIN_PERMISSIONS : Set.of();
return new DbUser(