用于通过appengine访问谷歌驱动器的webclient oauth2适用于localhost appengine
但在谷歌 Cloud 应用程序引擎抛出异常 .

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)”)
. 执行();
} catch(IOException e){
Log.severe(“for filelist”);
抛出新的IOException(“无法从服务中获取文件
OAuthUtils.getDataFromApi()“);
}

使用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"]}}

这是谷歌 Cloud appengine的例外

result = drive.files().list()
                .setPageSize(10)
                .setFields("nextPageToken, files(id, name)")
                .execute();

并抛出异常 .

com.google.api.client.googleapis.json.GoogleJsonResponseException:401 {“code”:401,“errors”:[{“domain”:“global”,“location”:“授权”,“locationType”:“ Headers “,”消息“:”无效凭据“,”原因“:”authError“}],”消息“:”无效凭据“} com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException . java:146)at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest . java:40)at com.google.api.client.googleapis.services.AbstractGoogleClientRequest $ 1.interceptResponse(AbstractGoogleClientRequest.java:321)at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1065)at at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.jav a:419)com.google.api.client.google客户网站上的com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352):( 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 . com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFil中的doFilter(ServletHandler.java:1166)之三(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)位于org.mortbay.jetty.servlet的com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60) .ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:48)at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler) .java:1157)org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)org.mortbay.jetty.securityHandler.handle(SecurityHandler.java:216)org.mortbay.jetty . servlet.SessionHandler.handle(SessionHandler.java:182)at org.mortbay.jetty.handler.ContextHandler.ha ndle(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)atg.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 . 手柄(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)在com.google.tracing.TraceContext $ traceContextRunnable.runInContext(TraceContext.java:453)com.google.tracing.TraceContext $ TraceContextRunnable $ 1.run(TraceContext.java:460)at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:293)at com www.google.tracing.TraceContext $ AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:319)com.google.tracing.TraceContext $ AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:311)com.google.tracing.TraceContext $ TraceContextRunnable.run(TraceContext) .java:457)在com.google.apphosting.runtime.ThreadGroupPool $ PoolEntry.run(ThreadGroupPool.java:238)at java.lang.Thread.run(Thread.java:745)

代码链接https://github.com/RupamShaw/GogleApplication/tree/master/backend/src/main注意:在本地主机访问屏幕上选择emailid,但是在googlecloud appengine上没有来自emailid的选择屏幕 . 请帮忙纠正 .