package crmdna.api.servlet; import com.google.api.client.auth.oauth2.AuthorizationCodeFlow; import com.google.api.client.auth.oauth2.AuthorizationCodeResponseUrl; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.auth.oauth2.TokenResponse; import crmdna.user.User; import crmdna.user.UserEntity; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.net.URLDecoder; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class GoogleOAuth2CallbackServlet extends HttpServlet { private static final long serialVersionUID = 1L; private final Lock lock = new ReentrantLock(); private AuthorizationCodeFlow flow; protected final void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { StringBuffer buf = req.getRequestURL(); if (req.getQueryString() != null) { buf.append('?').append(req.getQueryString()); } AuthorizationCodeResponseUrl responseUrl = new AuthorizationCodeResponseUrl(buf.toString()); String code = responseUrl.getCode(); if (responseUrl.getError() != null) { String state = URLDecoder.decode(req.getParameter("state"), "UTF-8"); String[] params = state.split("\\|"); resp.sendRedirect(params[1]); } else if (code == null) { resp.setStatus(HttpServletResponse.SC_BAD_REQUEST); resp.getWriter().print("Missing authorization code"); } else { String redirectUri = ServletUtils.getRedirectUri(req); lock.lock(); try { if (flow == null) { flow = ServletUtils.newFlow(); } TokenResponse response = flow.newTokenRequest(code).setRedirectUri(redirectUri).execute(); HttpSession sess = req.getSession(true); Credential credential = flow.createAndStoreCredential(response, sess.getId()); String[] params = URLDecoder.decode(req.getParameter("state"), "UTF-8").split("\\|"); String client = params[2]; String email = ServletUtils.getEmail(credential); UserEntity user = User.get(client, email); if (user != null) { sess.setAttribute("login", email); sess.setAttribute("loginType", "google"); } resp.sendRedirect(params[0]); } finally { lock.unlock(); } } } }