Зеркало быстрый запуск Java - соединение отказано

Попытка настроить проект Google Glass QuickStart на Apache Tomcat 7. Он отлично работает, когда я пытаюсь запустить его: http://localhost:8080 когда я в своей домашней сети. Но это не работает, когда я нахожусь в корпоративной сети.

Я настроил прокси-конфиги в context.xml и в коде, прежде чем он попытается обменять токен доступа. Я получаю исключение соединения, отклоненное в классе AuthServlet, который находится в исходном коде. Я также изменил исходный код, чтобы определить системные переменные для настроек прокси.

Когда я пытаюсь подключиться к любому URL-адресу в Интернете после настройки прокси-сервера, я могу подключиться к Интернету, но обмен токеном не удается, не знаю, почему это происходит. Может ли кто-нибудь, пожалуйста, указать мне в правильном направлении?

Ниже приведен код, который показывает настройки прокси:

public class AuthServlet extends HttpServlet {
  private static final Logger LOG = Logger.getLogger(AuthServlet.class.getSimpleName());

  @Override
  protected void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
      System.out.println("inside authservlet");
      System.setProperty("http.proxyHost", "proxy server");
      System.setProperty("http.proxyPort", "proxy server port");
      Authenticator.setDefault(
              new Authenticator() {
                  public PasswordAuthentication getPasswordAuthentication() {
                      return new PasswordAuthentication(
                              "username", "password".toCharArray());
                  }
              }
              );
      System.setProperty("http.proxyUser", "username");
      System.setProperty("http.proxyPassword", "password");
      System.out.println("finished proxy set up");
      try {
        URL myURL = new URL("http://google.com");
        URLConnection myURLConnection = myURL.openConnection();
        myURLConnection.connect();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
      System.out.println("trying to connect to a URL");
    // If something went wrong, log the error message.
    if (req.getParameter("error") != null) {
      LOG.severe("Something went wrong during auth: " + req.getParameter("error"));
      res.setContentType("text/plain");
      res.getWriter().write("Something went wrong during auth. Please check your log for details");
      return;
    }

    // If we have a code, finish the OAuth 2.0 dance
    if (req.getParameter("code") != null) {
      System.out.println("Got a code. Attempting to exchange for access token.");

      AuthorizationCodeFlow flow = AuthUtil.newAuthorizationCodeFlow();
      TokenResponse tokenResponse =
          flow.newTokenRequest(req.getParameter("code"))
              .setRedirectUri(WebUtil.buildUrl(req, "/oauth2callback")).execute();
      //Error is in the above line.

      // Extract the Google User ID from the ID token in the auth response
      String userId = ((GoogleTokenResponse) tokenResponse).parseIdToken().getPayload().getUserId();

Ниже приведены журналы с исключением

inside AuthFilter
sending redirect
inside AuthFilter
Skipping auth check during auth flow
inside authservlet
finished proxy set up
trying to connect to a URL
No auth context found. Kicking off a new auth flow.
inside AuthFilter
sending redirect
inside AuthFilter
Skipping auth check during auth flow
inside authservlet
finished proxy set up
trying to connect to a URL
No auth context found. Kicking off a new auth flow.
inside AuthFilter
Skipping auth check during auth flow
inside authservlet
finished proxy set up
trying to connect to a URL
Got a code. Attempting to exchange for access token.
Feb 18, 2014 1:04:20 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [oauth2callback] in context with path [] threw exception
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source)
    at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:77)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:283)
    at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest.execute(GoogleAuthorizationCodeTokenRequest.java:158)
    at com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeTokenRequest.execute(GoogleAuthorizationCodeTokenRequest.java:79)
    at com.google.glassware.AuthServlet.doGet(AuthServlet.java:86)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.google.glassware.ReauthFilter.doFilter(ReauthFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.google.glassware.AuthFilter.doFilter(AuthFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    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:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    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:1004)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

1 ответ

Решение

Проблема в том, что вы настраиваете HTTP-прокси-соединение, но при обмене OAuth используется HTTPS-соединение.

По крайней мере, вам нужно настроить информацию прокси для HTTPS с чем-то вроде

systemProperties.setProperty( "https.proxyHost", "proxy server" );
systemProperties.setProperty( "https.proxyPort", "secure proxy port" );

и вы должны обязательно проверить его с подключением к https://google.com/

Это, однако, самое меньшее, что вам может понадобиться. Реальность такова, что это может быть намного сложнее. HTTPS действительно не предназначен для работы через прокси, и прокси существенно подрывает большую часть всей безопасности, стоящей за ним. Есть много других вещей, которые вам может понадобиться настроить, чтобы вы сознательно подорвали контроль безопасности, и вам действительно не следует этого делать. (Но если вам нужно, это выглядит так: как отправить запрос HTTPS через прокси в Java? Есть несколько указателей на то, что вам нужно будет сделать.)

Но это только начало ваших проблем, если честно. Хотя это означает, что вы сможете отправлять вещи через прокси-сервер, Mirror API использует веб-хуки в качестве обратных вызовов для некоторых из своих функций, и эти обратные вызовы также будут передаваться через HTTPS. Таким образом, ваш прокси также должен иметь возможность обрабатывать входящие HTTPS-соединения и направлять их на ваш сервер.

Возможно, вы захотите изучить возможности тестирования на App Engine, так как эти проблемы будут решены для вас.

Другие вопросы по тегам