Skip to content
Snippets Groups Projects
Commit 389db754 authored by Elisa Giglio's avatar Elisa Giglio
Browse files

continuazione keycloak (prova)

parent f964485a
No related branches found
No related tags found
No related merge requests found
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
File deleted
No preview for this file type
No preview for this file type
...@@ -4,33 +4,46 @@ import java.io.BufferedReader; ...@@ -4,33 +4,46 @@ import java.io.BufferedReader;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URI; import java.net.URI;
import java.net.URL;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.net.ssl.HttpsURLConnection;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpHandler;
public class RedirectPage implements HttpHandler{ public class ObtainToken implements HttpHandler{
private KeyCloak kcs; private KeyCloak kcs;
private String state;
private String codeVerifier;
public RedirectPage(KeyCloak kcs) { public ObtainToken(KeyCloak kcs) {
this.kcs = kcs; this.kcs = kcs;
} }
@Override @Override
public void handle(HttpExchange exchange) throws IOException { public void handle(HttpExchange exchange) throws IOException {
URI requestURI = exchange.getRequestURI(); URI requestURI = exchange.getRequestURI();
boolean wantsRedirectPage = Helper.compareText(requestURI.toString(),URI.create("/").toString()); String stringURI = requestURI.toString();
if(!wantsRedirectPage) { boolean wantsRedirectPage = Helper.compareText(stringURI,URI.create("/").toString());
boolean wantsToken = Helper.compareText(stringURI,URI.create("/secured").toString());
if(wantsToken)
System.out.println("URI = "+exchange.getRequestURI().getPath());
if(!wantsRedirectPage && !wantsToken) {
String error = "Invalid URI"; String error = "Invalid URI";
OutputStream os = exchange.getResponseBody(); OutputStream os = exchange.getResponseBody();
exchange.sendResponseHeaders(400, error.getBytes().length); exchange.sendResponseHeaders(400, error.getBytes().length);
...@@ -39,45 +52,101 @@ public class RedirectPage implements HttpHandler{ ...@@ -39,45 +52,101 @@ public class RedirectPage implements HttpHandler{
return; return;
} }
String requestMethod = exchange.getRequestMethod(); String requestMethod = exchange.getRequestMethod();
if (Helper.compareText(requestMethod, "GET")) { if (Helper.compareText(requestMethod, "GET")) {
if(wantsRedirectPage) {
String codeVerifier = createCodeVerifier(); codeVerifier = createRandomString();
try { try {
String codeChallenge = createCodeChallenge(codeVerifier); String codeChallenge = createCodeChallenge(codeVerifier);
String state = "baf78db5-4c5b-4d56-8111-8fe63c38961a"; //An opaque arbitrary alphanumeric string your app adds to the initial request that Auth0 includes when redirecting back to your application.
String nonce = "a81e1a84-8885-4702-b8d1-f6c5a0d1fc4d"; state = createRandomString(); //An opaque arbitrary alphanumeric string your app adds to the initial request that Auth0 includes when redirecting back to your application.
System.out.println("CODE VERIFIER = "+codeVerifier); String nonce = "a81e1a84-8885-4702-b8d1-f6c5a0d1fc4d";
// get the html page // System.out.println("CODE VERIFIER = "+codeVerifier);
List<String> strlist = new ArrayList<>(); // get the html page
String response = null; List<String> strlist = new ArrayList<>();
response = getRedirectPage(); String response = null;
strlist.add("text/html"); response = getRedirectPage();
strlist.add("text/html");
if(response != null && !Helper.compareText(response, "fail")){
response = response.replace("$DOMAIN", kcs.authServer()) if(response != null && !Helper.compareText(response, "fail")){
.replace("$REALM", kcs.realm()) response = response.replace("$DOMAIN", kcs.authServer())
.replace("$MY_CODE_CHALLENGE", codeChallenge) .replace("$REALM", kcs.realm())
.replace("$MY_CLIENT_ID", kcs.clientId()) .replace("$MY_CODE_CHALLENGE", codeChallenge)
.replace("$MY_REDIRECT_URI", kcs.redirectUri()) .replace("$MY_CLIENT_ID", kcs.clientId())
.replace("$MY_NONCE",nonce) .replace("$MY_REDIRECT_URI", kcs.redirectUri())
.replace("$MY_STATE", state); .replace("$MY_NONCE",nonce)
System.out.println(response); .replace("$MY_STATE", state);
exchange.getResponseHeaders().put("content-type", strlist);
exchange.sendResponseHeaders(200, response.getBytes().length); exchange.getResponseHeaders().put("content-type", strlist);
OutputStream os = exchange.getResponseBody(); exchange.sendResponseHeaders(200, response.getBytes().length);
os.write(response.getBytes()); OutputStream os = exchange.getResponseBody();
os.close(); os.write(response.getBytes());
} else { os.close();
exchange.sendResponseHeaders(500, response.getBytes().length); } else {
OutputStream os = exchange.getResponseBody(); exchange.sendResponseHeaders(500, response.getBytes().length);
os.write(response.getBytes()); OutputStream os = exchange.getResponseBody();
os.close(); os.write(response.getBytes());
} os.close();
}
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
System.out.println("Error during creation of code challenge"); System.out.println("Error during creation of code challenge");
} }
}
if(wantsToken) {
// NON FUNZIONA PERCHE' LA
String[] arr = stringURI.split("/secured");
for(int i=0; i<arr.length; i++)
System.out.println(arr[i]);
System.out.println("lunghezza = "+arr.length);
String allParamsString = stringURI.split("/secured")[1];
System.out.println("allParamsString = "+allParamsString);
String[] allParamsArray = allParamsString.split("&");
String state = allParamsArray[0];
if(!this.state.equals(state)) {
Helper.badRequest(exchange);
return;
}
String authCode = allParamsArray[2];
// request token
String httpsURL = "http://"+kcs.authServer()+"/realms/"+kcs.realm()+"/protocol/openid-connect/token";
URL myUrl = new URL(httpsURL);
// SSLUtilities.trustAllHttpsCertificates();
// SSLUtilities.trustAllHostnames();
HttpsURLConnection conn = (HttpsURLConnection)myUrl.openConnection();
conn.setReadTimeout(7000);
conn.setConnectTimeout(7000);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
String body = "grant_type=authorization_code"
+ "&client_id="+kcs.clientId()
+ "&code_verifier="+codeVerifier
+ "&code="+authCode
+ "&redirect_uri=https://localhost:3000/secured";
OutputStream outputStream = conn.getOutputStream();
outputStream.write(body.getBytes("UTF-8"));
outputStream.close();
String inputLine;
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String response = "";
while ((inputLine = br.readLine()) != null) {
response += inputLine;
}
br.close();
System.out.println(response);
// String answer = response.replace(remoteHOST,localHOST);
}
} else { } else {
Helper.methodNotAllowed(exchange); Helper.methodNotAllowed(exchange);
} }
...@@ -146,7 +215,7 @@ public class RedirectPage implements HttpHandler{ ...@@ -146,7 +215,7 @@ public class RedirectPage implements HttpHandler{
} }
private String createCodeVerifier() { private String createRandomString() {
SecureRandom sr = new SecureRandom(); SecureRandom sr = new SecureRandom();
byte[] code = new byte[32]; byte[] code = new byte[32];
sr.nextBytes(code); sr.nextBytes(code);
......
...@@ -104,8 +104,10 @@ public class Server { ...@@ -104,8 +104,10 @@ public class Server {
server.createContext("/js/",new Resources()); server.createContext("/js/",new Resources());
server.createContext("/css/",new Resources()); server.createContext("/css/",new Resources());
server.createContext("/res/",new ImageRes()); server.createContext("/res/",new ImageRes());
server.createContext("/",new RedirectPage(kcs)); server.createContext("/secured/",new ObtainToken(kcs));
server.createContext("/secured",new Home()); server.createContext("/secured",new ObtainToken(kcs));
server.createContext("/",new ObtainToken(kcs));
server.setExecutor(Executors.newCachedThreadPool()); server.setExecutor(Executors.newCachedThreadPool());
server.start(); server.start();
System.out.println("webserver running on localhost:"+port); System.out.println("webserver running on localhost:"+port);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment