UserService.getCurrentUser() 返回 null。

3

我已经在Java中使用Google OAuth API实现了三条腿的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时! 我认为,如果我已经注销,则应该将我重定向到登录页面。 但是它没有!

此外,根据这里和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)

参考资料:使用用户服务 APIs:com.google.appengine.api.oauthcom.google.appengine.api.users Google OAuth 存在(尽可能少的)bug吗?
2个回答

1
需要创建发送重定向URL:
response.sendRedirect(userService.createLoginURL(request.getRequestURI()));

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


0

我曾经遇到过类似的问题,这是由于签名问题导致的。

我的应用程序将参数放在请求体内,在使用“application/x-www-form-urlencoded” MIME 类型进行 POST 请求。

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

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

编辑:

看起来当存在多个具有相同名称的参数时,它会失败。

在构建签名时,应考虑 HTTP 主体中的参数(使用“application/x-www-form-urlencoded”)和重复的参数名称,具体请参见 9.1.1. Normalize Request Parameters

但是,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,它被包含在不支持的功能中。

相关帖子:在Android上使用Google API Java客户端,POST请求似乎无法使用OAuth对Google App Engine应用进行身份验证


我报告了一个重复参数问题:https://code.google.com/p/google-oauth-java-client/issues/detail?id=91 - user992029

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接