Java webclient appengine在本地工作,但在Google Cloud 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

用于通过appengine访问google drive的webclient oauth2在本地主机appengine上工作
但在谷歌云上,应用引擎抛出了一个例外

       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();