如何访问云相关的api
问题
预研访问国外厂商云api相关的代码,发现请求国外厂商云获取token时,发生了下面的错误:
com.google.auth.oauth2.GoogleAuthException: Error getting access token for service account: connect timed out, iss: testmanagebucket@esoteric-cab-458306-c2.iam.gserviceaccount.comat com.google.auth.oauth2.GoogleAuthException.createWithTokenEndpointIOException(GoogleAuthException.java:163)at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:546)at com.google.auth.oauth2.OAuth2Credentials$1.call(OAuth2Credentials.java:270)at com.google.auth.oauth2.OAuth2Credentials$1.call(OAuth2Credentials.java:267)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at com.google.auth.oauth2.OAuth2Credentials$RefreshTask.run(OAuth2Credentials.java:635)at com.google.common.util.concurrent.DirectExecutor.execute(DirectExecutor.java:31)at com.google.auth.oauth2.OAuth2Credentials$AsyncRefreshResult.executeIfNew(OAuth2Credentials.java:582)at com.google.auth.oauth2.OAuth2Credentials.asyncFetch(OAuth2Credentials.java:233)at com.google.auth.oauth2.OAuth2Credentials.refreshIfExpired(OAuth2Credentials.java:204)at com.google.cloud.Demo.main(Demo.java:25)
Caused by: java.net.SocketTimeoutException: connect timed outat java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)at java.net.Socket.connect(Socket.java:606)at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:303)at sun.net.NetworkClient.doConnect(NetworkClient.java:175)at sun.net.www.http.HttpClient.openServer(HttpClient.java:499)at sun.net.www.http.HttpClient.openServer(HttpClient.java:594)at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:263)at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:366)at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:207)at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1167)at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1061)at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:193)at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1354)at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1329)at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:264)at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:113)at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:84)at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1012)at com.google.auth.oauth2.ServiceAccountCredentials.refreshAccessToken(ServiceAccountCredentials.java:541)... 9 more
经过检查,发现是因为电脑直连国外云厂商相关的域名,被ban了。
解决方案
准备好代理服务,如果代理服务使用的是shadowsocks服务协议,则可以在代码里面加上Java的系统属性配置代理,需要在GoogleCredentials之前设置代理系统属性:
System.setProperty("socksProxyHost", "Your_socks_proxy_host_一般是127.0.0.1");System.setProperty("socksProxyPort","通过下图所示获取到10808");
代码验证
java代码
public class Demo {public static void main(String[] args) throws IOException {System.setProperty("socksProxyHost", "127.0.0.1");System.setProperty("socksProxyPort","10808");String serviceAccountPath = "C:\\Data\\googleserviceaccount.json";try {GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(serviceAccountPath)).createScoped(new ArrayList<>(Collections.singleton("https://www.googleapis.com/auth/cloud-platform")));credentials.refreshIfExpired();String token = String.valueOf(credentials.getAccessToken());System.out.println(token);} catch (Exception e) {e.printStackTrace();System.out.println(e.getMessage());}return ;}
}
对应的maven要引入下面所示的依赖代码包<dependency><groupId>com.google.api-client</groupId><artifactId>google-api-client</artifactId><version>2.7.1</version></dependency><dependency><groupId>com.google.auth</groupId><artifactId>google-auth-library-bom</artifactId><version>1.34.0</version></dependency>
执行结果
返回了目标token
AccessToken{tokenValue=ya29.c.c0ASRK0Ga5YcPSvjrtaP4H2agRcZkajqGt49s3VMQ2fUB-_3WFjG8V3yQJyG9AtPU04Pqiidogrof0sY6zsaGBocYPnVeXNwPxLUPllg2LBP37WhjA0pCHwpMtthgGqS2yb2677gS6JZc7jgNQyQTcmWSv8cc2Exhd6D8NI6dWg2NO60bWE7FaDK2Hd1XlJeZMYKBqncprq_IKDrWp3y5DZ3ofCTA9TZpUMYBn5dJzSh60aVkTsdxhS1v8rxGHlega8rUInriAN2AZ5EVZUvVt_d6EhSPZZwJfO87deRuj3qxhfPLHpbv_r9eBo8JIYBCTf3UIIjdeXCrlRuB2SI78S-sWHSn0gI06pS1ibXHfGKB7d0E5AWL7_CDEL385PI81RBol02J3sjeeS_749l7dfo4hgJBwj54lS1-9ogm9nvBjuotm7kykFB_tnQitw1O3aUO4V_usxScX_qiSnixtkm2UkodqJ80unxmhWl70-XMeWg1Vgy7stfJ-Bxs8Upipt1X2huBf-icdlZgXh6cBd07n8ev-xIYi4dltSz5J6ipIBch55y4MUfIwchlyze69u2k-93Rojv7vz_sMFjjtwxScppfV7ZQ65SqB1BQealW9kolBBi4xO7B7uFq9BMJgW4p-l3y6kSBIJMfl2e4s4SpmyWt65Br6Jfqp-Mjrrfwg271F__WRS-9jdggM98btauwM80ljYOvsmqhsju8WI0jJgyah1exS1vigFoBjyOw2WdFMUgJuwvgh1p_dxFc6qS4QWawWhk2tj7zvSSOazr9hB-8VbyqytWSl1QJ1k77wgfxjxeh1oaSmXz3I37SrU00QUq8ZZlFFZBaZVQWW4a7XXd24YQsXe8vZtMlXc3QZdkF_lcyegg8U3ek3UeIft-3wnb2BFfje6nRc9Yx8uI_v1c5az5vmJ6uonvw7mI2-RF1j3_UV0o10OW8u249143uplw8MWxYxYoomkb11vh5p0l6ecrdpJ0Q_l7WqR2l2mUcrZfss3yg, expirationTimeMillis=1747142023645, scopes=[]}Process finished with exit code 0