Authentifizierung fuer Modul jdk.httpserver
ulrich
2021-06-03 c7d492742233c73d4594e5ff3b3b448809d93209
commit | author | age
9ee357 1 /*
c7d492 2   http-auth - Authentication Extensions to jdk.httpserver
9ee357 3   Copyright (C) 2021  Ulrich Hilger
U 4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as
7   published by the Free Software Foundation, either version 3 of the
8   License, or (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.httpserver.auth.handler;
19
20 import com.sun.net.httpserver.Authenticator;
21 import com.sun.net.httpserver.Headers;
22 import com.sun.net.httpserver.HttpContext;
23 import com.sun.net.httpserver.HttpExchange;
24 import com.sun.net.httpserver.HttpHandler;
25 import de.uhilger.httpserver.auth.TokenAuthenticator;
26 import de.uhilger.httpserver.auth.realm.User;
27 import java.io.IOException;
28 import java.text.SimpleDateFormat;
29 import java.util.Date;
30 import java.util.Locale;
31
32 /**
33  *
34  * @author Ulrich Hilger
35  * @version 1, 30.05.2021
36  */
37 public abstract class LoginHandler implements HttpHandler {
38   
39   /* Der Logger fuer diesen JWTLoginHandler */
40   //private static final Logger logger = Logger.getLogger(LoginHandler.class.getName());
41   
6e87f8 42   public static final String ATTR_AUTHENTICATOR = "authenticator";
9ee357 43   
U 44   
45   //protected String ctx;
46
47   /**
48    * Wenn einfach ein HTML-Formular hierhin geschickt wird, das wie
49    * bei Java die Formular-Eingabefelder 'j_username' und 'j_password'
50    * enthaelt, kommt im Body folgendes an:
51    * j_username=name&j_password=password
52    *
53    * body koennte auch einen JSON-Ausdruck enthalten wie z.B.
54    * {"name": "fred", "password": "secret"}
55    *
56    * Das ist hier noch nicht implementiert
57    *
58    * @param exchange
59    * @throws IOException
60    */
61   @Override
62   public void handle(HttpExchange exchange) throws IOException {
63     User nutzer = getUser(exchange);
64     HttpContext context = exchange.getHttpContext();
6e87f8 65     Object o = context.getAttributes().get(ATTR_AUTHENTICATOR);
9ee357 66     if (o instanceof TokenAuthenticator) {
6e87f8 67       TokenAuthenticator auth = (TokenAuthenticator) o;
U 68       String token = auth.anmelden(nutzer.getName(), nutzer.getPassword());
9ee357 69       if (token != null) {
6e87f8 70         loginResponse(exchange, auth, token);
9ee357 71       } else {
U 72         // Nutzer und Kennwort passen nicht
73       }
74     } else {
75       // interner Fehler: Kein passender Authenticator
76     }
77   }
78   
79   protected void setAuthenticatedHeader(HttpExchange exchange, Authenticator auth, String token) {
80     if(auth instanceof TokenAuthenticator) {
6e87f8 81       TokenAuthenticator tAuth = (TokenAuthenticator) auth;
9ee357 82       // angemeldet, Token als Antwort zurueckgeben
U 83       Headers respHeaders = exchange.getResponseHeaders();
84       // JWT=[cookie-inhalt]; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly
85       SimpleDateFormat f = 
86               new SimpleDateFormat(TokenAuthenticator.HEADER_DATE_PATTERN, Locale.US);
87       Date exp = Date.from(new Date().toInstant().plusSeconds(TokenAuthenticator.TOKEN_EXPIRATION));
88       respHeaders.add(TokenAuthenticator.SET_COOKIE_HEADER, 
6e87f8 89               tAuth.cookieBilden(TokenAuthenticator.JWT_INDICATOR, token, exp));
9ee357 90     }
U 91   }
92   
93   protected abstract void loginResponse(HttpExchange exchange, Authenticator auth, String token) throws IOException;
94   
95   protected abstract User getUser(HttpExchange exchange) throws IOException;
96
6e87f8 97   /*
9ee357 98   protected String bodyLesen(HttpExchange exchange) throws IOException {
U 99     StringBuilder sb = new StringBuilder();
100     InputStream is = exchange.getRequestBody();
101     BufferedReader in = new BufferedReader(new InputStreamReader(is));
102     String line = in.readLine();
103     while (line != null) {
104       sb.append(line);
105       line = in.readLine();
106     }
107     return sb.toString();
108   }
6e87f8 109   */
9ee357 110   
U 111 }