package com.github.hburgmeier.jerseyoauth2.authsrv.impl.endpoints.servlet;
import java.io.IOException;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.hburgmeier.jerseyoauth2.api.protocol.IAccessTokenRequest;
import com.github.hburgmeier.jerseyoauth2.api.protocol.IRequestFactory;
import com.github.hburgmeier.jerseyoauth2.api.protocol.OAuth2ParseException;
import com.github.hburgmeier.jerseyoauth2.api.protocol.OAuth2ProtocolException;
import com.github.hburgmeier.jerseyoauth2.api.protocol.ResponseBuilderException;
import com.github.hburgmeier.jerseyoauth2.authsrv.api.IConfiguration;
import com.github.hburgmeier.jerseyoauth2.authsrv.api.protocol.IHttpContext;
import com.github.hburgmeier.jerseyoauth2.authsrv.api.protocol.IOAuth2Response;
import com.github.hburgmeier.jerseyoauth2.authsrv.api.token.ITokenService;
import com.github.hburgmeier.jerseyoauth2.authsrv.api.ui.AuthorizationFlowException;
import com.github.hburgmeier.jerseyoauth2.authsrv.impl.protocol.response.HttpServletContextImplementation;
import com.github.hburgmeier.jerseyoauth2.protocol.impl.HttpRequestAdapter;
import com.google.inject.Singleton;
@Singleton
public class IssueAccessTokenServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final Logger LOGGER = LoggerFactory.getLogger(IssueAccessTokenServlet.class);
private final ITokenService tokenService;
private final IConfiguration configuration;
private final IRequestFactory requestFactory;
@Inject
public IssueAccessTokenServlet(final ITokenService tokenService, final IConfiguration configuration, final IRequestFactory requestFactory) {
this.tokenService = tokenService;
this.configuration = configuration;
this.requestFactory = requestFactory;
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
IHttpContext context = new HttpServletContextImplementation(request, response, getServletContext());
try {
IAccessTokenRequest oauthRequest = null;
try {
oauthRequest = requestFactory.parseAccessTokenRequest(new HttpRequestAdapter(request),
configuration.getEnableAuthorizationHeaderForClientAuth());
LOGGER.debug("Parsing OAuthTokenRequest successful");
IOAuth2Response oauth2Response = tokenService.handleRequest(request, oauthRequest);
oauth2Response.render(context);
} catch (OAuth2ParseException e) {
LOGGER.error("Token request problem", e);
IOAuth2Response oauth2Response = tokenService.sendErrorResponse(oauthRequest,e);
oauth2Response.render(context);
} catch (OAuth2ProtocolException e) {
LOGGER.error("Token request problem", e);
IOAuth2Response oauth2Response = tokenService.sendErrorResponse(oauthRequest, e);
oauth2Response.render(context);
}
} catch (AuthorizationFlowException | ResponseBuilderException e) {
LOGGER.error("OAuth2 system exception", e);
throw new ServletException(e);
}
}
}