title: Google oauth java client to get an access token fails with "400 Bad Request { "error" : "invalid_request" }"
body: <p>I am using "web server applications" example shown here. In my callback servlet I want to retrieve an access token but I am not able to successfully do it. 
  Following is my code </p>
  
  <pre><code>  @Override
    protected String getUserId(HttpServletRequest req) throws ServletException, IOException {
      // return user ID
        Iterator&lt;String&gt; iterator = req.getParameterMap().keySet().iterator();
          while (iterator.hasNext()) {
              String string = iterator.next();
  
              System.out.println(string+"---++--"+req.getParameter(string));
          }
          GoogleAuthorizationCodeTokenRequest newTokenRequest = new GoogleAuthorizationCodeFlow.Builder(new NetHttpTransport(), new JacksonFactory(),
                                                               "2XXXXXX7218.apps.googleusercontent.com", "KugD_XXX_7vqnGZVXXXXX1M",
                                                                Collections.singleton("https://gdata.youtube.com"))
                                                                .build().newTokenRequest(req.getParameter("code"));
          //GoogleAuth
          GoogleTokenResponse token = newTokenRequest.setRedirectUri("/").execute();
          String accessToken = token.getAccessToken();
          System.out.println("accesstoken:"+accessToken);
          return "";
    }
  </code></pre>
  
  <p>After running this code I am getting following error</p>
  
  <pre><code>com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
  {
    "error" : "invalid_request"
  }
  </code></pre>
  
  <p>In a nutshell I am getting the "code" parameter(request code) I am not sure how to convert it to Access token.
  I have already seen 
  <a href="https://stackoverflow.com/questions/10799947/google-api-request-for-token-from-oauth2-returns-invalid-request">Google API - request for token from Oauth2 returns &quot;invalid_request&quot;</a> 
  <a href="https://stackoverflow.com/questions/11696526/google-oauth-2-response-type-error-on-token-request">Google OAuth 2: response_type error on token request</a> but there wan't much I could use in my code</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>The google API did not work for me so I wrote following code without using any library</p>
  
  <pre><code> URL url = new URL("https://accounts.google.com/o/oauth2/token");
      connection = (HttpURLConnection) url.openConnection();
      String urlParameters = "code=" + req.getParameter("code") + "&amp;client_id=29852.apps.googleusercontent.com&amp;client_secret=KugD_LVi_7vqnssssxxxNRBz1M"+
              "&amp;redirect_uri=https://flixomnia.com/oauth2callback&amp;grant_type=authorization_code&amp;scope=https://gdata.youtube.com&amp;response_type=token";
      connection.setDoOutput(true);
      connection.setDoInput(true);
      connection.setInstanceFollowRedirects(true);
      connection.setRequestMethod("POST");
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
      connection.setRequestProperty("Authorization", "Bearer 4/q3Xh_pJI458XXXXXXXkh-lxe3-8.cmaD6o7V5BkQXE-XXXXX-edgI");
      connection.setRequestProperty("Content-Length", "" + Integer.toString(urlParameters.getBytes().length));
      connection.setRequestProperty("X-GData-Key", "key=AI39siXXXXXXM7tyHBvXEM1lLcORetit6QSArQ3sjelBxXXXXXXtgLSPdZPxvsF_vkntOQMnAEYAuVFqhN7oUw");
      connection.setRequestProperty("GData-Version", "2");
  
      connection.setUseCaches(false);
      //com.google.gdata.client.youtube.YouTubeService service = new com.google.gdata.client.youtube.YouTubeService("","");
      //YouTubeMediaGroup g = new YouTubeMediaGroup();
  
  
      DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
  
      wr.writeBytes(urlParameters);
      wr.flush();
      InputStream inputStream = connection.getInputStream();
      byte[] b = new byte[1024];
      while (inputStream.read(b) != -1) {
          System.out.print(new String(b));
  
      }
      System.out.println("");
      wr.close();
      connection.disconnect();
  </code></pre>
  
  <p>But still I get following error</p>
  
  <pre><code>    {  "error" : "invalid_request"}
  java.io.IOException: Server returned HTTP response code: 400 for URL: https://accounts.google.com/o/oauth2/token
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1615)
      at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
      at com.broadcastr.servlets.YouTubeCallbackService.getUserId(YouTubeCallbackService.java:168)
      at com.google.api.client.extensions.servlet.auth.oauth2.AbstractAuthorizationCodeCallbackServlet.doGet(AbstractAuthorizationCodeCallbackServlet.java:130)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
      at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
      at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
      at java.lang.Thread.run(Thread.java:722)
  </code></pre>