【问题标题】:UserService.getCurrentUser() returns nullUserService.getCurrentUser() 返回 null
【发布时间】:2011-06-22 17:36:15
【问题描述】:

我已经使用 Java 中的 Google OAuth API 实现了 3-legged OAuth。

我的应用程序已在 GAE 上注册。而且,我也成功获得了访问令牌。但是,现在当我创建 UserService 的对象时,即使我登录了 Gmail 以及我的个人域邮件,它在调用 getCurrentUser() 时返回 null !

我的代码是:

import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

    oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
    oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
    oauthParameters.setScope("https://spreadsheets.google.com/feeds/");
    oauthParameters.setOAuthType(OAuthParameters.OAuthType.THREE_LEGGED_OAUTH);
    oauthParameters.setOAuthToken(request.getSession().getAttribute("oauth_token").toString());
    oauthParameters.setOAuthTokenSecret(request.getSession().getAttribute("oauth_token_secret").toString());

UserService userService = UserServiceFactory.getUserService();
out.println("<br/>Get Current User : " + userService.getCurrentUser());

使用用户服务时无需专门添加任何jar。那么这里有什么问题呢?

当我尝试这个时:

out.println(userService.isUserLoggedIn() ? "User is Logged In" : "User is Log Off");

它输出:

用户已注销

当我同时登录我的个人域和 gmail 时!我认为,如果我退出,这可能会将我重定向到登录页面。但是,它没有!

另外,根据here & in systempuntout 的答案,如果我尝试:

OAuthService oauth = OAuthServiceFactory.getOAuthService();
User user = oauth.getCurrentUser();
out.println("<br/>Get Current User : " + user.getNickname());

不过,它会停止执行! :(

我在 Google App Engine 日志中收到以下错误:

Oauth.requestServlet doGet: null
com.google.appengine.api.oauth.InvalidOAuthParametersException: Unknown
    at com.google.appengine.api.oauth.OAuthServiceImpl.makeSyncCall(OAuthServiceImpl.java:73)
    at com.google.appengine.api.oauth.OAuthServiceImpl.getGetOAuthUserResponse(OAuthServiceImpl.java:53)
    at com.google.appengine.api.oauth.OAuthServiceImpl.getCurrentUser(OAuthServiceImpl.java:28)
    at Oauth.accessFeeds.access(accessFeeds.java:60)
    at Oauth.requestServlet.processRequest(requestServlet.java:129)
    at Oauth.requestServlet.doGet(requestServlet.java:199)

供参考:Using the Users Service 对于 API:com.google.appengine.api.oauth、com.google.appengine.api.users

Google OAuth 是否存在(最不可能的)错误?

【问题讨论】:

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


    【解决方案1】:

    我遇到了类似的问题,这是由于签名问题而发生的。

    我的应用在请求正文中发送参数,执行具有“application/x-www-form-urlencoded”mime 类型的 POST。

    OAuthParameters 对请求进行签名时,包含待签名数据中的所有查询参数。在这种情况下,参数为空。

    将请求参数从 HTTP 请求正文移动到 URL 查询字符串解决了这个问题。

    已编辑:

    当有多个同名参数时,它似乎失败了。

    根据9.1.1. Normalize Request Parameters构建签名时,应考虑HTTP正文中的参数(使用“application/x-www-form-urlencoded”)和重复的参数名称。

    但看起来OAuthParameters 没有考虑方法“computeSignature()”(第 137 行)的这两种可能性。事实上,在第 157 行,我们有以下代码:

    for (Object repeatedValue : (Collection<?>) value) {
        putParameter(parameters, name, repeatedValue);
    }
    

    只保留重复参数的最后一个值?

    编辑 2:

    编码参数问题在问题1中报告:https://code.google.com/p/google-oauth-java-client/issues/detail?id=1。这是一个已知问题。在 javadocs:http://javadoc.google-api-java-client.googlecode.com/hg/1.2.2-alpha/com/google/api/client/auth/oauth/package-summary.html 它包含在不支持的功能。

    相关帖子:Using Google API Java Client on Android, a POST request does not seem to authenticate with Google App Engine app using OAuth

    【讨论】:

    【解决方案2】:

    需要创建发送重定向 URL:

    response.sendRedirect(userService.createLoginURL(request.getRequestURI()));
    

    这将重定向到谷歌登录页面,然后您将能够获取用户名!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2020-06-19
      • 2011-10-15
      相关资源
      最近更新 更多