webclient oauth2用于通过appengine访问谷歌驱动器工作在localhost 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;
try { result = drive.files().list() .setPageSize(10) .setFields("nextPageToken, files(id, name)") .execute(); } catch (IOException e) { Log.severe("for filelist"); throw new IOException("not able to get files from service 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"]}}
这是google cloud appengine的例外
result = drive.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute();
并抛出异常。
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 {"代码" :401,"错误" :[{" domain" :"全球", "位置" :"授权",
"的locationType" :"标题","消息" :"凭证无效","原因" :" authError" }]," message" :"证书无效" } 在 com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146) 在 com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113) 在 com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(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)at com.google.api.client.extensions.servlet.auth.oauth2.AbstractAuthorizationCodeServlet.service(AbstractAuthorizationCodeServlet.java:130) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:717)at 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)at 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) 在 com.google.tracing.CurrentContext.runInContext(CurrentContext.java:293) 在 com.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) 在java.lang.Thread.run(Thread.java:745)
代码链接 https://github.com/RupamShaw/GogleApplication/tree/master/backend/src/main 注意:在localhost访问屏幕上选择emailid,但是在googlecloud appengine上没有来自emailid的选择屏幕。 请帮忙纠正。