我正在开发基于Java servlet&JSP的Web应用程序。我想要支持用户通过Google登录进行登录。我复制示例JSP代码从互联网获取以打开Google登录页面。之后如果用户成功登录,则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服务器的传出连接实际上已被阻止!