Servlet无法验证收到的Google登录令牌

问题描述 投票:0回答:1

我正在开发基于Java servlet&JSP的Web应用程序。我想要支持用户通过Google登录进行登录。我复制示例JSP代码从互联网获取以打开Goog​​le登录页面。之后如果用户成功登录,则Javascript代码会将令牌发送到Servlet。然后,该Servlet使用以下代码来验证接收到的令牌:

public static GoogleIdToken.Payload getPayload (String tokenString) throws Exception {
     GoogleIdTokenVerifier verifier =
         new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new JacksonFactory())
     .setAudience(Collections.singletonList(GOOGLE_CLIENT_ID))
     .build();
     Payload payload = null;
     GoogleIdToken idToken = verifier.verify(tokenString);
     if (idToken != null) {
        payload = idToken.getPayload();
        String userId = payload.getSubject();
        System.out.println("User ID: " + userId);
        // Get profile information from payload
        String email = payload.getEmail();
        boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
        String name = (String) payload.get("name");
     } // of if (idToken != null)
     return payload;
  }

但是,代码verifier.verify(...)始终导致以下异常:

java.net.SocketTimeoutException:连接超时java.net.DualStackPlainSocketImpl.waitForConnect(本机方法)java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)java.net.Socket.connect(Socket.java:589)sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668)sun.net.NetworkClient.doConnect(NetworkClient.java:175)sun.net.www.http.HttpClient.openServer(HttpClient.java:432)sun.net.www.http.HttpClient.openServer(HttpClient.java:527)sun.net.www.protocol.https.HttpsClient。(HttpsClient.java:264)sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1105)sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999)sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:93)com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981)com.google.api.client.googleapis.auth.oauth2.GooglePublicKeysManager.refresh(GooglePublicKeysManager.java:172)com.google.api.client.googleapis.auth.oauth2.GooglePublicKeysManager.getPublicKeys(GooglePublicKeysManager.java:141)com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier.verify(GoogleIdTokenVerifier.java:174)com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier.verify(GoogleIdTokenVerifier.java:192)

我不知道为什么。可以帮帮忙!

提前感谢!

google-signin google-oauth2
1个回答
0
投票

我将令牌验证代码复制到控制台程序,并在本地计算机上运行它。该代码按预期工作。因此,连接超时异常是由于网络设置问题引起的。与Google服务器的传出连接实际上已被阻止!

© www.soinside.com 2019 - 2024. All rights reserved.