package com.perforce.workshop.tjuricek.p4oauth.controllers; import com.perforce.workshop.tjuricek.p4oauth.services.CodeService; import com.perforce.workshop.tjuricek.p4oauth.config.UrlFactory; import com.perforce.workshop.tjuricek.p4oauth.services.CodeError; import com.perforce.workshop.tjuricek.p4oauth.util.HttpServletRequestHelper; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; /** * Perform the "code" authorization request. * <p> * Note that this mechanism REQUIRES a whitelisted redirect URL. * <p> * See also <a href="http://tools.ietf.org/html/rfc6749#section-4.1.1">rfc6749 section 4.1.1</a> */ public class AuthorizationStartGet implements ControllerMethod { public static final String AUTH_CODE_PATH = "/grants/authorization_code"; private Function<HttpServletRequest, HttpServletRequestHelper> requestWrapper; private Supplier<CodeService> codeService; private Supplier<UrlFactory> urlFactory; public AuthorizationStartGet(Function<HttpServletRequest, HttpServletRequestHelper> requestWrapper, Supplier<CodeService> codeService, Supplier<UrlFactory> urlFactory) { this.requestWrapper = requestWrapper; this.codeService = codeService; this.urlFactory = urlFactory; } /** * @see ControllerMethod#matches(javax.servlet.http.HttpServletRequest) */ @Override public boolean matches(HttpServletRequest baseRequest) { HttpServletRequestHelper request = requestWrapper.apply(baseRequest); return request.pathStartsWith(AUTH_CODE_PATH) && request.hasMethod("GET") && request.paramEquals("response_type", "code") && request.paramNotEmpty("client_id"); } /** * @see ControllerMethod#handle(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public void handle(HttpServletRequest baseRequest, HttpServletResponse response) throws IOException, ServletException { HttpServletRequestHelper request = requestWrapper.apply(baseRequest); // Validated by matches String login = request.getParam("client_id").get(); Optional<String> redirectOpt = request.getParam("redirect_uri"); if (!redirectOpt.isPresent()) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Missing required parameter redirect_uri"); return; } CodeError err = codeService.get().startCodeRequest(redirectOpt.get()); if (err != null) { response.sendError(HttpServletResponse.SC_FORBIDDEN, "The redirect_uri is not whitelisted: " + redirectOpt.get()); return; } String state = request.getParam("state").orElse(null); response.sendRedirect(urlFactory.get().getLoginUrl(login, redirectOpt.get(), state)); } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 9095 | tjuricek | Added some basic test data and renamed "workspace" to "workshop" in package name | ||
//guest/tjuricek/p4oauth/src/main/java/com/perforce/workspace/tjuricek/p4oauth/controllers/AuthorizationStartGet.java | |||||
#1 | 9089 | tjuricek |
Moving some code that worked via some manual validation to the workshop. This just implements a basic code authorization grant scheme. Automated tests are forthcoming, awating some gradle plugin work that should sit outside of this project. |