package auth.login; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.oltu.oauth2.client.request.OAuthClientRequest; import org.apache.oltu.oauth2.common.exception.OAuthProblemException; import org.apache.oltu.oauth2.common.exception.OAuthSystemException; import org.apache.oltu.oauth2.common.message.types.ResponseType; import auth.openidconnect.ApplicationException; import auth.openidconnect.OAuthParams; import auth.openidconnect.ProviderData; import auth.openidconnect.Utils; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.auth.RequestToken; import utils.Constants; import utils.LoginUtils; public class BeginAuthorization extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String providerName = request.getParameter("provider"); if(providerName == null){ response.sendError(400); return; } if(providerName.equals("auto")){ String provider = LoginUtils.findCookieValue(request, Constants.COOKIE_PROVIDER_KEY); if(provider != null && provider.length() > 0){ providerName = provider; } else{ response.sendError(400); return; } } String clientId = Utils.getClientId(providerName, request); if(clientId == null || clientId.length() == 0){ response.sendError(401, "Login Provider is not configured"); return; } if(providerName.equals(Utils.TWITTER)){ authorizeWithTwitter(request, response); } else { Twitter twitter = (Twitter) request.getSession().getAttribute(Utils.TWITTER); if(twitter != null){ request.getSession().setAttribute(Utils.TWITTER, null); } authorize(initOAuthParams(providerName, request), request, response); } } catch (Exception e) { throw new ServletException(e); } } private void authorizeWithTwitter(HttpServletRequest request, HttpServletResponse response) throws TwitterException, IOException { Twitter twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer(Utils.getClientId(Utils.TWITTER, request), Utils.getClientSecret(Utils.TWITTER, request)); request.getSession().setAttribute(Utils.TWITTER, twitter); StringBuffer callbackURL = request.getRequestURL(); int index = callbackURL.lastIndexOf("/"); callbackURL.replace(index, callbackURL.length(), "").append("/redirect"); RequestToken requestToken = twitter.getOAuthRequestToken(callbackURL.toString()); request.getSession().setAttribute("requestToken", requestToken); response.sendRedirect(requestToken.getAuthenticationURL()); } private OAuthParams initOAuthParams(String providerName, HttpServletRequest request) throws OAuthProblemException{ OAuthParams oauthParams = new OAuthParams(); oauthParams.setApplication(providerName); ProviderData providerData = Utils.getProvider(providerName, request); oauthParams.setTokenEndpoint(providerData.getTokenEndpoint()); oauthParams.setClientId(Utils.getClientId(providerName, request)); oauthParams.setClientSecret(Utils.getClientSecret(providerName, request)); oauthParams.setRedirectUri(Utils.getRedirectUri(request.getServerName())); oauthParams.setScope(providerData.getScope()); oauthParams.setState(System.currentTimeMillis()+""); oauthParams.setAuthzCode(""); oauthParams.setAuthzEndpoint(providerData.getAuthzEndpoint()); return oauthParams; } public void authorize(OAuthParams oauthParams, HttpServletRequest req, HttpServletResponse res) throws OAuthSystemException, IOException{ try { Utils.validateAuthorizationParams(oauthParams, req.getServerName()); res.addCookie(new Cookie("clientId", oauthParams.getClientId())); res.addCookie(new Cookie("clientSecret", oauthParams.getClientSecret())); res.addCookie(new Cookie("authzEndpoint", oauthParams.getAuthzEndpoint())); res.addCookie(new Cookie("tokenEndpoint", oauthParams.getTokenEndpoint())); res.addCookie(new Cookie("redirectUri", oauthParams.getRedirectUri())); res.addCookie(new Cookie("scope", oauthParams.getScope())); res.addCookie(new Cookie("state", oauthParams.getState())); res.addCookie(new Cookie("app", oauthParams.getApplication())); OAuthClientRequest request = OAuthClientRequest .authorizationLocation(oauthParams.getAuthzEndpoint()) .setClientId(oauthParams.getClientId()) .setRedirectURI(oauthParams.getRedirectUri()) .setResponseType(ResponseType.CODE.toString()) .setScope(oauthParams.getScope()) .setState(oauthParams.getState()) .buildQueryMessage(); res.sendRedirect(request.getLocationUri()); } catch (ApplicationException e) { oauthParams.setErrorMessage(e.getMessage()); } } }