Java GWT和AppEngine中的Google Oauth2

Java GWT和AppEngine中的Google Oauth2,java,google-app-engine,gwt,google-drive-api,google-oauth,Java,Google App Engine,Gwt,Google Drive Api,Google Oauth,我正在尝试为Google Drive实施身份验证: 首先,当用户被重定向到Google登录页面进行身份验证时,这并不明显。看起来他们没有展示那个部分 第二,它不显示回拨代码。我想我可以解决这个问题,并且需要添加一个新的servlet或服务或入口点,但是使用GWT可能会很棘手 第三,也是最重要的一点,我一直得到一个ClassNotFoundException,即使该类存在并且编译良好 Caused by: java.lang.NoClassDefFoundError: com/google/ap

我正在尝试为Google Drive实施身份验证:

首先,当用户被重定向到Google登录页面进行身份验证时,这并不明显。看起来他们没有展示那个部分

第二,它不显示回拨代码。我想我可以解决这个问题,并且需要添加一个新的servlet或服务或入口点,但是使用GWT可能会很棘手

第三,也是最重要的一点,我一直得到一个ClassNotFoundException,即使该类存在并且编译良好

Caused by: java.lang.NoClassDefFoundError: com/google/api/client/http/HttpRequestInitializer
    at com.onix.sdm.server.SDMServiceImpl.loginServer(SDMServiceImpl.java:37)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
    ... 40 more
Caused by: java.lang.ClassNotFoundException: com.google.api.client.http.HttpRequestInitializer
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:215)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 47 more
它正在这条线上死去:

37      DriveAuthentication da = new DriveAuthentication(); // Same as MyClass

那么如何将Google Oauth2添加到GWT中呢?

GWT是一种客户端技术,但您发布的链接是用于服务器身份验证的。因此,第一步是决定要使用哪种方法

如果您想要服务器身份验证,那么您发布的链接是正确的,GWT对此一无所知。您的GWT应用程序将使用RPC/REST等调用您的服务器,您的服务器将执行驱动器访问


另一方面,如果您想进行客户端身份验证,那么您需要这个链接来描述您需要发布到的URL。我的建议是远离库,自己理解并发送原始URL

客户端或服务器都可以。如果是客户端,我将向服务器提交刷新和访问令牌。它不会在.client包中编译。它说找不到InputStream类(或类似类)。这在.server包中,它不会运行!似乎更像是AppEngine的问题而不是GWT的问题。希望使用原始URL。以前,我们已经用Perl实现了Oauth2,但是非常棘手。如果他们提供SDK,为什么要重新发明轮子?问题是它们改变了每个SDK库的抽象。我可以谦虚地说,您还没有完全掌握client v。服务器身份验证。在客户端身份验证中,没有刷新令牌。最后你回答了自己的问题。imho oauth SDK是一个非常容易泄漏的抽象。经过几个星期的挫折之后,我放弃了它。DIY只需要3个URL。(1) 用于授权/识别的重定向URL,然后使用授权代码重定向到回调servlet;(2) 将访问代码转换为刷新令牌(存储)的POST URL;(3) 使用refreshtoken请求accesstoken的POST URL。你需要知道的一切都在你误解的那一页上。*。client和*.server分别是GWT放置客户端和服务器代码的包。OAuth代码的任何一个位置都适合我。我知道GWT。我的观点是,代码是不同的(非常非常不同),这取决于您是要执行服务器Oauth还是客户端Oauth。Oauth流完全不同,对您的应用程序和用户体验有不同的影响。您需要了解这两个流,然后决定哪一个适合您的需要。需要刷新令牌和访问令牌。如果用户未登录或注销,则需要运行。Oauth身份验证可以是GWT客户端或GWT服务器端。目前正在进行GWT服务器端Oauth身份验证。在/oauth2callback之后,让客户端知道用户已通过身份验证是很棘手的。