java,驱动APIv2,appengine 1.7.3,struts2.3.4.1,OAuth2。 TokenResponseException:400 OK invalid_grant [英] java, drive APIv2, appengine 1.7.3, struts2.3.4.1, OAuth2. TokenResponseException: 400 OK invalid_grant

查看:82
本文介绍了java,驱动APIv2,appengine 1.7.3,struts2.3.4.1,OAuth2。 TokenResponseException:400 OK invalid_grant的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到了我已经看到googleing arround的错误invalid_grant,但是在与这个问题斗争了一段时间之后。
错误发生在:

  File file = insert.execute(); 

我只想将我的webapp上的文件从appengine上传到Google Drive。
我使用API​​访问(https://code.google.com/apis/console/)中使用服务帐户生成的私钥对(.p12):

 服务帐户

使用服务帐户代替应用程序而不是最终用户调用Google API。了解更多信息
客户端ID:
xxx-xxxxxx.apps.googleusercontent.com
电子邮件地址:
xxx-xxxxxxxxxxx@developer.gserviceaccount.com
公钥指纹:
a108d8713103e09d0013655c9f80458f03e3a38a - 删除...

在Google APis - >驱动器SDK(https: //code.google.com/apis/console/?api=drive#project:347347146680:drive_sdk)我已经把这个ClientID:

 硬盘集成
OAuth客户端ID(必需)

输入您的应用程序的客户端ID。您可以在API访问面板上配置客户端ID。

任何帮助都会令人高兴!我的代码:
$ b

struts.xml:

 < interceptor name =gaeFileUploadInterceptorclass =com.struts2.gae.interceptor.GaeFileUploadInterceptor/> 
< interceptor-stack name =fileUploadStack>
< interceptor-ref name =gaeFileUploadInterceptor>< / interceptor-ref>
< interceptor-ref name =basicStack>< / interceptor-ref>
< / interceptor-stack>


< action name =uploadInit>
< result> jsp / common / upload.jsp< / result>
< / action>

< result> jsp / common / upload.jsp< / result>
< interceptor-ref name =fileUploadStack/>
< result name =successtype =stream>
< param name =contentType> image / jpeg,image / gif,image / png< / param>
< param name =inputName> photoStream< / param>
< param name =contentDisposition> filename =photo.jpg< / param>
< param name =bufferSize> 1024< / param>
< / result>
< / action>

Upload.java:

  //文件上传(参见struts.xml拦截器& struts2-gae-0.1.jar 
私有字符串照片;
私有字符串photoContentType; //文件的内容类型
private String photoFileName; //上传的文件名
private InputStream photoStream;
[...]
public String upload(){
try {
if(photo!= null){
GoogleDrive.insertLocalFile(title,description,null,photoContentType,photo);
}
} catch(Exception e){
log.debug(new String(),e);
}
return SUCCESS2;
}

GoogleDrive.java:

  public static File insertLocalFile(String title,String description,
String parentId,String mimeType,String data){
File body = new File();
body.setTitle(title);
body.setDescription(description);
body.setMim ETYPE(mime类型);

Drive service = null;
尝试{
service = getDriveService();
文件files = service.files();
InputStreamContent isc = new InputStreamContent(mimeType);
isc.setData(data);
插入insert = files.insert(body,isc); // mediaContent);
文件file = insert.execute();
返回文件;
} catch(IOException e){
log.error(new String(),e);
返回null;



public static Drive getDriveService(){
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
GoogleCredential凭证;
Drive service = null;
尝试{
证书=新GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
//.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountId(SERVICE_ACCOUNT_ID)
.setServiceAccountScopes(DriveScopes.DRIVE_FILE)
.setServiceAccountPrivateKeyFromP12File(new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.setServiceAccountUser(SERVICE_ACCOUNT_EMAIL)
.build( );
service = new Drive.Builder(httpTransport,jsonFactory,null)
.setHttpRequestInitializer(凭证).build();
} catch(GeneralSecurityException e){
log.error(new String(),e);
} catch(IOException e){
log.error(new String(),e);
}
退货服务;
}

Stacktrace:

  com.google.api.client.auth.oauth2.TokenResponseException:400 OK 
{
error:invalid_grant
}
在com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
在com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303 )
,位于com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
位于com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken (GoogleCredential.java:340)
在com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:505)
在com.google.api.client.auth.oauth2 .Credential.intercept(Credential.java:266)com.google.api.client.http.HttpRequest.execute上的
(HttpRequest.java:857)com.google.api.client.googleapis上的
.media.MediaHttpUploader.executeUploadInitiation(MediaHttpUploader.java:337)
at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:252)
com.google.api.services.drive.Drive $ Files $ Insert.executeUnparsed(Drive.java:309 )
at com.google.api.services.drive.Drive $ Files $ Insert.execute(Drive.java:331)
at util.google.GoogleDrive.insertLocalFile(GoogleDrive.java:365)
at com.lm.action.common.Upload.upload(Upload.java:108)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(Method.java:601)
在com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
在com.opensymphony.xwork2.DefaultActionInvocation.invok eActionOnly(DefaultActionInvocation.java:292)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java: 138)
。在com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
。在com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
在com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
在com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
在com.opensymphony.xwork2 .interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke (德发ultActionInvocation.java:249)美元,org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75 B $ B)
在com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at com .opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
在com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
在com.opensymphony.xwork2 .DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation .java:249)
在com.open symphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
处com.struts2.gae.interceptor com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
。 GaeFileUploadInterceptor.intercept(GaeFileUploadInterceptor.java:275)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy。的java:在org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:511 54)

。在org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:432)
在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
在com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java: 74)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at co m.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
。在com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
。在com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61)
在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
在com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler $ Cache dChain.doFilter(ServletHandler.java:1157)
在com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
。在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)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java: 765)
在org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)在com.google.appengine.tools.development.DevAppEngineWebAppContext.handle
(DevAppEngineWebAppContext.java:94)
处com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle(JettyContainerService org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
。 java:383)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
。在org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)在org.mortbay.jetty.HttpConnection $ RequestHandler.content
(HttpConnection.java:938)
在org.mortbay .jetty.HttpParser.parseNext(HttpParser.java:755)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection的.java:404)
。在在org.mortbay.thread.QueuedThreadPool $ PoolThread.run org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
(QueuedThreadPool.java:582 )


解决方案

您误以服务帐户ID。您应该使用:

 凭证=新的GoogleCredential.Builder()
.setTransport(httpTransport)
。 setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
//.setServiceAccountId(SERVICE_ACCOUNT_ID)
.setServiceAccountScopes(DriveScopes.DRIVE_FILE)
.setServiceAccountPrivateKeyFromP12File(new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH ))
//.setServiceAccountUser(SERVICE_ACCOUNT_EMAIL)
.build();

应该使用 setServiceAccountUser()方法只有当你想模仿一个真正的用户。


I'm getting the error invalid_grant I've allready seen googleing arround, but after been fighting some days with this issue. The error is thrown in:

File file = insert.execute();

I just would like to upload files from my webapp in appengine to google drive. I'm using private pair key (.p12) generated in the API Access (https://code.google.com/apis/console/) using a Service Account:

 Service account

Use service accounts to call Google APIs on behalf of your application instead of an end-user. Learn more
Client ID:  
xxx-xxxxxx.apps.googleusercontent.com
Email address:  
xxx-xxxxxxxxxxx@developer.gserviceaccount.com
Public key fingerprints:    
a108d8713103e09d0013655c9f80458f03e3a38a    –   Delete...

In the Google APis -> drive SDK (https://code.google.com/apis/console/?api=drive#project:347347146680:drive_sdk) I've put this ClientID:

Drive Integration
OAuth Client ID (Required)

Enter the Client ID for your application. You can configure a client ID on the "API Access" panel.

Any help will be appreciatte! Thanks!

My code:

struts.xml:

        <interceptor name="gaeFileUploadInterceptor" class="com.struts2.gae.interceptor.GaeFileUploadInterceptor" />
        <interceptor-stack name="fileUploadStack">
            <interceptor-ref name="gaeFileUploadInterceptor"></interceptor-ref>
            <interceptor-ref name="basicStack"></interceptor-ref>
        </interceptor-stack>


<action name="uploadInit">
    <result>jsp/common/upload.jsp</result>
</action>

<action name="upload" method="upload" class="com.lm.action.common.Upload">
    <result>jsp/common/upload.jsp</result>
    <interceptor-ref name="fileUploadStack"/>
        <result name="success" type="stream">
            <param name="contentType">image/jpeg,image/gif,image/png</param>
            <param name="inputName">photoStream</param>
            <param name="contentDisposition">filename="photo.jpg"</param>
            <param name="bufferSize">1024</param>
        </result>
</action>

Upload.java:

//File uploading (see struts.xml interceptors & struts2-gae-0.1.jar
private String photo;
private String photoContentType; //The content type of the file
private String photoFileName; //The uploaded file name
private InputStream photoStream;
[...]
public String upload() {
    try {
        if (photo!=null) {
            GoogleDrive.insertLocalFile("title","description",null,photoContentType,photo); 
        }
    } catch (Exception e ) {
        log.debug(new String(), e);
    }
    return SUCCESS2;
}   

GoogleDrive.java:

public static File insertLocalFile(String title, String description,
        String parentId, String mimeType, String data) {
    File body = new File();
    body.setTitle(title);
    body.setDescription(description);
    body.setMimeType(mimeType);

    Drive service = null;
    try {
        service = getDriveService();
        Files files = service.files();
        InputStreamContent isc = new InputStreamContent(mimeType);
        isc.setData(data);
        Insert insert = files.insert(body, isc);  //mediaContent);
        File file = insert.execute();
        return file;
    } catch (IOException e) {
        log.error(new String(), e);
        return null;
    }
}

public static Drive getDriveService() {
    HttpTransport httpTransport = new NetHttpTransport();
    JacksonFactory jsonFactory = new JacksonFactory();
    GoogleCredential credential;
    Drive service = null;
    try {
        credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                //.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
                .setServiceAccountId(SERVICE_ACCOUNT_ID)
                .setServiceAccountScopes(DriveScopes.DRIVE_FILE)
                .setServiceAccountPrivateKeyFromP12File(new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
                .setServiceAccountUser(SERVICE_ACCOUNT_EMAIL)
                .build();
        service = new Drive.Builder(httpTransport, jsonFactory, null)
                .setHttpRequestInitializer(credential).build();
    } catch (GeneralSecurityException e) {
        log.error(new String(), e);
    } catch (IOException e) {
        log.error(new String(), e);
    }
    return service;
}

Stacktrace:

com.google.api.client.auth.oauth2.TokenResponseException: 400 OK
{
  "error" : "invalid_grant"
}
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:303)
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:323)
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:340)
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:505)
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:266)
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:857)
    at com.google.api.client.googleapis.media.MediaHttpUploader.executeUploadInitiation(MediaHttpUploader.java:337)
    at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:252)
    at com.google.api.services.drive.Drive$Files$Insert.executeUnparsed(Drive.java:309)
    at com.google.api.services.drive.Drive$Files$Insert.execute(Drive.java:331)
    at util.google.GoogleDrive.insertLocalFile(GoogleDrive.java:365)
    at com.lm.action.common.Upload.upload(Upload.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:236)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.struts2.gae.interceptor.GaeFileUploadInterceptor.intercept(GaeFileUploadInterceptor.java:275)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:511)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:432)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:383)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

解决方案

You are mistaken with the Service account id. You should use :

credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            //.setServiceAccountId(SERVICE_ACCOUNT_ID)
            .setServiceAccountScopes(DriveScopes.DRIVE_FILE)
            .setServiceAccountPrivateKeyFromP12File(new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
            //.setServiceAccountUser(SERVICE_ACCOUNT_EMAIL)
            .build();

The setServiceAccountUser() method should be used only if you want to impersonate a real user.

这篇关于java,驱动APIv2,appengine 1.7.3,struts2.3.4.1,OAuth2。 TokenResponseException:400 OK invalid_grant的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆