diff --git a/src/main/java/de/devloop/mavor/Configuration.java b/src/main/java/de/devloop/mavor/Configuration.java index 1c7ccad..94ea54f 100644 --- a/src/main/java/de/devloop/mavor/Configuration.java +++ b/src/main/java/de/devloop/mavor/Configuration.java @@ -12,8 +12,21 @@ public class Configuration { private static final String ENV_MAVEN_EXECUTABLE = "MAVOR_MAVEN_EXECUTABLE"; private static final String ENV_TEMP_DIR = "MAVOR_TEMP_DIR"; + private static final String ENV_OPENID_CLIENT_ID = "MAVOR_OPENID_CLIENT_ID"; + private static final String ENV_OPENID_CLIENT_SECRET = "MAVOR_OPENID_CLIENT_SECRET"; + private static final String ENV_OPENID_REDIRECT_URL = "MAVOR_OPENID_REDIRECT_URL"; + private static final String ENV_OPENID_AUTH_URL = "MAVOR_OPENID_AUTH_URL"; + private static final String ENV_OPENID_TOKEN_URL = "MAVOR_OPENID_TOKEN_URL"; + private static final String ENV_OPENID_USERINFO_URL = "MAVOR_OPENID_USERINFO_URL"; + private String mavenExecutable; private String tempDir; + private String openIdClientId; + private String openIdClientSecret; + private String openIdRedirectUrl; + private String openIdAuthUrl; + private String openIdTokenUrl; + private String openIdUserInfoUrl; public Configuration() throws IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); @@ -28,8 +41,18 @@ public class Configuration { } private void initByProperties(Properties properties) { - mavenExecutable = properties.getProperty(ENV_MAVEN_EXECUTABLE); - tempDir = properties.getProperty(ENV_TEMP_DIR); + mavenExecutable = getNullSafeProperty(properties, ENV_MAVEN_EXECUTABLE); + tempDir = getNullSafeProperty(properties, ENV_TEMP_DIR); + openIdClientId = getNullSafeProperty(properties, ENV_OPENID_CLIENT_ID); + openIdClientSecret = getNullSafeProperty(properties, ENV_OPENID_CLIENT_SECRET); + openIdRedirectUrl = getNullSafeProperty((properties), ENV_OPENID_REDIRECT_URL); + openIdAuthUrl = getNullSafeProperty(properties, ENV_OPENID_AUTH_URL); + openIdTokenUrl = getNullSafeProperty(properties, ENV_OPENID_TOKEN_URL); + openIdUserInfoUrl = getNullSafeProperty(properties, ENV_OPENID_USERINFO_URL); + } + + private String getNullSafeProperty(Properties properties, String key) { + return Objects.requireNonNull(properties.getProperty(key)); } public String getMavenExecutable() { @@ -39,4 +62,28 @@ public class Configuration { public String getTempDir() { return tempDir; } + + public String getOpenIdClientId() { + return openIdClientId; + } + + public String getOpenIdClientSecret() { + return openIdClientSecret; + } + + public String getOpenIdRedirectUrl() { + return openIdRedirectUrl; + } + + public String getOpenIdAuthUrl() { + return openIdAuthUrl; + } + + public String getOpenIdTokenUrl() { + return openIdTokenUrl; + } + + public String getOpenIdUserInfoUrl() { + return openIdUserInfoUrl; + } } \ No newline at end of file diff --git a/src/main/java/de/devloop/mavor/servlet/Authentication.java b/src/main/java/de/devloop/mavor/servlet/Authentication.java index 2b28803..d9cab78 100644 --- a/src/main/java/de/devloop/mavor/servlet/Authentication.java +++ b/src/main/java/de/devloop/mavor/servlet/Authentication.java @@ -2,9 +2,11 @@ package de.devloop.mavor.servlet; import java.io.IOException; +import de.devloop.mavor.Configuration; import de.devloop.mavor.Session; import de.devloop.openid.AuthenticationUrl; import de.devloop.openid.OpenID; +import de.devloop.openid.OpenIdConfiguration; import de.devloop.openid.OpenIdRequestException; import de.devloop.openid.Token; import de.devloop.openid.UserInfo; @@ -20,12 +22,32 @@ public class Authentication extends HttpServlet { private static final String PARAMETER_STATE = "state"; private static final String PARAMETER_CODE = "code"; + private OpenIdConfiguration openIdConfiguration; + private OpenID openID; + + @Override + public void init() throws ServletException { + Configuration configuration; + try { + configuration = new Configuration(); + } catch (IOException e) { + throw new ServletException("Configuration Error", e); + } + + openIdConfiguration = new OpenIdConfiguration(); + openIdConfiguration.setAuthUrl(configuration.getOpenIdAuthUrl()); + openIdConfiguration.setClientId(configuration.getOpenIdClientId()); + openIdConfiguration.setClientSecret(configuration.getOpenIdClientSecret()); + openIdConfiguration.setRedirectUrl(configuration.getOpenIdRedirectUrl()); + openIdConfiguration.setTokenUrl(configuration.getOpenIdTokenUrl()); + openIdConfiguration.setUserInfoUrl(configuration.getOpenIdUserInfoUrl()); + + openID = new OpenID(openIdConfiguration); + } + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Session session = new Session(req.getSession(true)); - - OpenID openID = new OpenID(); - if (req.getParameter(PARAMETER_STATE) != null && req.getParameter(PARAMETER_CODE) != null) { if (req.getParameter(PARAMETER_STATE).equals(session.getOAuthState())) { session.clearOAuthState(); diff --git a/src/main/java/de/devloop/openid/OpenID.java b/src/main/java/de/devloop/openid/OpenID.java index f002030..38179cd 100644 --- a/src/main/java/de/devloop/openid/OpenID.java +++ b/src/main/java/de/devloop/openid/OpenID.java @@ -1,6 +1,7 @@ package de.devloop.openid; import java.io.IOException; +import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; import java.net.URLEncoder; @@ -17,19 +18,23 @@ import java.util.UUID; import com.google.gson.Gson; public class OpenID { - private static final String CLIENT_ID = "vP9xF2s1yy2n6sR05jV6dguyMeOvIxCg1GarV71O"; - private static final String CLIENT_SECRET = "PrwGSMcucxYPkOdrb23jddWqyn31vphrxCUu9MGdLTCUnbk0OJI5oWCvO0khVhcnJNDbJaKWxNMxaC4bJ92jy8bDjtG6oaWG37qhuLRPMh5DKluZxsCMmCvQ8f9ZQckZ"; - private static final String REDIRECT_URL = "http://localhost:8080/mavor/authenticate"; + private final OpenIdConfiguration configuration; - private static final String OAUTH_AUTH_URL = "https://auth.devloop.de/application/o/authorize/"; - private static final String OAUTH_TOKEN_URL = "https://auth.devloop.de/application/o/token/"; - private static final String OAUTH_USERINFO_URL = "https://auth.devloop.de/application/o/userinfo/"; + public OpenID(OpenIdConfiguration configuration) { + this.configuration = configuration; + } public AuthenticationUrl getAuthenticationUrl() { String state = UUID.randomUUID().toString(); - String url = String.format("%s?response_type=code&client_id=%s&redirect_uri=%s&state=%s&scope=openid email", OAUTH_AUTH_URL, CLIENT_ID, REDIRECT_URL, state); - return new AuthenticationUrl(url, state); + StringBuilder url = new StringBuilder(); + url.append(configuration.getAuthUrl()); + url.append("?response_type=code"); + url.append("&client_id=" + configuration.getClientId()); + url.append("&redirect_uri=" + configuration.getRedirectUrl()); + url.append("&state=" + state); + + return new AuthenticationUrl(url.toString(), state); } private URI getUriObject(String url) throws OpenIdRequestException { @@ -41,13 +46,13 @@ public class OpenID { } public Token requestToken(String code) throws OpenIdRequestException { - URI tokenUrl = getUriObject(OAUTH_TOKEN_URL); + URI tokenUrl = getUriObject(configuration.getTokenUrl()); HashMap tokenParameter = new HashMap<>(); tokenParameter.put("grant_type", "authorization_code"); - tokenParameter.put("client_id", CLIENT_ID); - tokenParameter.put("client_secret", CLIENT_SECRET); + tokenParameter.put("client_id", configuration.getClientId()); + tokenParameter.put("client_secret", configuration.getClientSecret()); tokenParameter.put("code", code); - tokenParameter.put("redirect_uri", REDIRECT_URL); + tokenParameter.put("redirect_uri", configuration.getRedirectUrl()); HttpRequest tokenRequest = HttpRequest.newBuilder() .uri(tokenUrl) @@ -68,7 +73,7 @@ public class OpenID { } public UserInfo requestUserInfo(Token token) throws OpenIdRequestException { - URI userInfoUrl = getUriObject(OAUTH_USERINFO_URL); + URI userInfoUrl = getUriObject(configuration.getUserInfoUrl()); HttpRequest userInfoRequest = HttpRequest.newBuilder() .uri(userInfoUrl) .header("Accept", "application/json") @@ -83,6 +88,10 @@ public class OpenID { throw new OpenIdRequestException("Requesting user info failed", e); } + if (userInfoResponse.statusCode() != HttpURLConnection.HTTP_OK) { + throw new OpenIdRequestException(String.format("Requesting user info failed with HTTP code '%d'", userInfoResponse.statusCode())); + } + Gson gson = new Gson(); return gson.fromJson(userInfoResponse.body(), UserInfo.class); } diff --git a/src/main/java/de/devloop/openid/OpenIdConfiguration.java b/src/main/java/de/devloop/openid/OpenIdConfiguration.java new file mode 100644 index 0000000..1e60bd6 --- /dev/null +++ b/src/main/java/de/devloop/openid/OpenIdConfiguration.java @@ -0,0 +1,58 @@ +package de.devloop.openid; + +public class OpenIdConfiguration { + private String clientId; + private String clientSecret; + private String redirectUrl; + private String authUrl; + private String tokenUrl; + private String userInfoUrl; + + public String getClientId() { + return clientId; + } + + public void setClientId(String clientId) { + this.clientId = clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public void setClientSecret(String clientSecret) { + this.clientSecret = clientSecret; + } + + public String getRedirectUrl() { + return redirectUrl; + } + + public void setRedirectUrl(String redirectUrl) { + this.redirectUrl = redirectUrl; + } + + public String getAuthUrl() { + return authUrl; + } + + public void setAuthUrl(String authUrl) { + this.authUrl = authUrl; + } + + public String getTokenUrl() { + return tokenUrl; + } + + public void setTokenUrl(String tokenUrl) { + this.tokenUrl = tokenUrl; + } + + public String getUserInfoUrl() { + return userInfoUrl; + } + + public void setUserInfoUrl(String userInfoUrl) { + this.userInfoUrl = userInfoUrl; + } +} diff --git a/src/main/java/de/devloop/openid/OpenIdRequestException.java b/src/main/java/de/devloop/openid/OpenIdRequestException.java index cc41032..ce396c3 100644 --- a/src/main/java/de/devloop/openid/OpenIdRequestException.java +++ b/src/main/java/de/devloop/openid/OpenIdRequestException.java @@ -1,6 +1,10 @@ package de.devloop.openid; public class OpenIdRequestException extends Exception { + public OpenIdRequestException(String message) { + super(message); + } + public OpenIdRequestException(String message, Throwable cause) { super(message, cause); }