【问题标题】:Google Oauth2 in GWT and AppEngineGWT 和 AppEngine 中的 Google Oauth2
【发布时间】:2013-10-02 18:06:55
【问题描述】:

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

https://google-developers.appspot.com/drive/auth/web-server

第一,用户被重定向到谷歌登录页面进行身份验证时并不明显。他们似乎没有展示那部分。

第二,它不显示回调代码。我想我可以解决这个问题,并且需要添加一个新的 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 中?

【问题讨论】:

    标签: java google-app-engine gwt google-drive-api google-oauth


    【解决方案1】:

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

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

    另一方面,如果您想进行客户端身份验证,则需要此链接https://developers.google.com/accounts/docs/OAuth2UserAgent,它描述了您需要发布到的 URL。我的建议是远离图书馆,自己理解和发送原始 URL。

    【讨论】:

    • 客户端或服务器都可以。如果是客户端,我会将刷新和访问令牌提交给服务器。它不会在 .client 包中编译。它说找不到 InputStream 类(或类似的)。这是在 .server 包中,它不会运行!似乎比 GWT 更多的是 AppEngine 的问题。很想使用原始 URL。之前在 Perl 中使用它实现了 Oauth2,但非常棘手。如果他们提供 SDK,为什么要重新发明轮子?问题是他们改变了每个 SDK 库的抽象。
    • 我可以谦虚地建议您还没有完全掌握客户端与服务器身份验证。在客户端身份验证中,没有刷新令牌。你在最后回答了你自己的问题。恕我直言,oauth SDK 是一个非常容易泄漏的抽象。经过几个令人沮丧的几周后,我放弃了它。 DIY它只有3个网址。 (1) 用于授权/识别的重定向 URL,然后使用授权代码重定向到您的回调 servlet; (2) 用于将访问代码转换为刷新令牌(您存储的)的 POST URL; (3) POST URL 使用刷新令牌请求访问令牌。您需要知道的一切都在 1 页上 goo.gl/1CoFpk
    • 你误会了。 *.client 和 *.server 是 GWT 分别放置客户端和服务器代码的包。 OAuth 代码的任何一个位置都适合我。
    • 我知道 GWT。我的观点是代码是不同的(非常非常不同),具体取决于您是要执行服务器 Oauth 还是客户端 Oauth。 Oauth 流程完全不同,对您的应用程序和用户体验有不同的影响。您需要了解这两种流程,然后决定哪一种适合您的需求。
    • 需要服务器 Oauth。需要刷新令牌和访问令牌。如果用户未登录或注销,则需要运行。 Oauth 认证可以是 GWT 客户端或 GWT 服务器端。目前致力于 GWT 服务器端 Oauth 身份验证。让客户端知道用户在 /oauth2callback 之后经过身份验证的技巧。
    猜你喜欢
    • 2011-11-13
    • 2011-09-14
    • 2011-09-24
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多