Java webclient appengine在本地工作,但在Google Cloud appengine上引发异常
用于通过appengine访问google drive的webclient oauth2在本地主机appengine上工作Java webclient appengine在本地工作,但在Google Cloud appengine上引发异常,java,google-app-engine,google-drive-api,google-cloud-platform,google-api-java-client,Java,Google App Engine,Google Drive Api,Google Cloud Platform,Google Api Java Client,用于通过appengine访问google drive的webclient oauth2在本地主机appengine上工作 但在谷歌云上,应用引擎抛出了一个例外 static GoogleAuthorizationCodeFlow initializeFlow() throws IOException { Log.info("in initializeFlow oauthUtils"); return new GoogleAuthorizationCodeFlow
但在谷歌云上,应用引擎抛出了一个例外
static GoogleAuthorizationCodeFlow initializeFlow() throws IOException {
Log.info("in initializeFlow oauthUtils");
return new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT_REQUEST,
JSON_FACTORY, getClientSecrets(), PERMISSION_SCOPES)
getClientSecrets().getDetails().getClientId(),
getClientSecrets().getDetails().getClientSecret(),
PERMISSION_SCOPES)
.setDataStoreFactory(DATA_STORE_FACTORY)
.setAccessType("online").build();
}
AuthorizationCodeFlow authFlow = initializeFlow();
Credential credential =
authFlow.loadCredential(getUserId(req));
drive = new Drive.Builder(
HTTP_TRANSPORT_REQUEST, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
FileList result = null;
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();
使用client_secrets.json
{"web":{"client_id":"1006959462162-qmlxxxxxxxxxx.apps.googleusercontent.com","project_id":"ggledrvsrvcaccntxxxxxxxx","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/o/oauth2/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"Z-GUR_uf2hfh_seMz","redirect_uris":["https://ggledrvsrvcaccnt.firebaseapp.com/__/auth/handler","https://www.getpostman.com/oauth2/callback","http://localhost:8080/oauth2callback","https://ggledrvsrvcaccntxxxxxxxx.appspot.com/oauth2callback"],"javascript_origins":["http://localhost","http://localhost:5000","https://ggledrvsrvcaccntxxxxxxxx.firebaseapp.com"]}}
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();
这是谷歌云appengine的一个例外
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();
并抛出异常
static GoogleAuthorizationCodeFlow initializeFlow() throws IOException {
Log.info("in initializeFlow oauthUtils");
return new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT_REQUEST,
JSON_FACTORY, getClientSecrets(), PERMISSION_SCOPES)
getClientSecrets().getDetails().getClientId(),
getClientSecrets().getDetails().getClientSecret(),
PERMISSION_SCOPES)
.setDataStoreFactory(DATA_STORE_FACTORY)
.setAccessType("online").build();
}
AuthorizationCodeFlow authFlow = initializeFlow();
Credential credential =
authFlow.loadCredential(getUserId(req));
drive = new Drive.Builder(
HTTP_TRANSPORT_REQUEST, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
FileList result = null;
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();
com.google.api.client.googleapis.json.googlejson响应异常:
401{“代码”:401,“错误”:[{“域”:“全局”,
“位置”:“授权”
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();
“locationType”:“标头”,“消息”:“无效凭据”,“原因”
:“authError”}],“message”:“无效凭据”}位于
google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)
在
com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.NewExceptionError(AbstractGoogleJsonClientRequest.java:113)
在
com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.NewExceptionError(AbstractGoogleJsonClientRequest.java:40)
在
com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:321)
在
com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)
在
com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419)
在
com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
在
com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
在
com.jagdiv.webapplication.backend.OAuthUtils.getDriveService(OAuthUtils.java:120)
在
com.jagdiv.webapplication.backend.OAuthUtils.getDataFromApi(OAuthUtils.java:404)
在
com.jagdiv.webapplication.backend.DriveServlet.doPost(DriveServlet.java:88)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
com.google.api.client.extensions.servlet.auth.oauth2.AbstractAuthorizationCodeServlet.service(AbstractAuthorizationCodeServlet.java:130)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
在
com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:37)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
在
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
在
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
在
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
在
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
在
com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:257)
在
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
位于org.mortbay.jetty.Server.handle(Server.java:326)
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
在
org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
在
com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
位于org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:145)
在
com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchServletRequest(JavaRuntime.java:644)
在
com.google.apphosting.runtime.JavaRuntime$RequestRunnable.dispatchRequest(JavaRuntime.java:604)
在
com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:574)
在
TraceContext$TraceContextRunnable.runInContext(TraceContext.java:453)
在
TraceContext$TraceContextRunnable$1.run(TraceContext.java:460)
在
com.google.tracing.CurrentContext.runInContext(CurrentContext.java:293)
在
com.google.tracing.TraceContext$AbstractTraceContextCallback.RunInheritedContextNonRef(TraceContext.java:319)
在
com.google.tracing.TraceContext$AbstractTraceContextCallback.RunInheritedContext(TraceContext.java:311)
在
TraceContext$TraceContextRunnable.run(TraceContext.java:457)
在
com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:238)
运行(Thread.java:745)
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();
代码链接
注意:在localhost access屏幕上选择emailid时出现,但在Google Cloud appengine上选择emailid时不会出现。
请帮助更正。请编辑您的问题并包括异常和堆栈跟踪。请编辑您的问题并包括异常和堆栈跟踪。
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();