UserService.getCurrentUser()返回null

时间:2011-02-07 12:53:15

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

我在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");

输出:

  

用户注销

当我登录我的个人域名&amp; gmail两个!我想,如果我签字,这可能会将我重定向到登录页面。但是,它没有!

另外,根据here&amp;在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.oauthcom.google.appengine.api.users

Google OAuth是否(最不可能)出现错误?

2 个答案:

答案 0 :(得分:1)

需要创建发送重定向网址:

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

这将重定向到谷歌登录页面&amp;那么你将能够获取用户名!

答案 1 :(得分:0)

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

我的应用是在请求正文中发送参数,使用&#34; application / x-www-form-urlencoded&#34;执行POST。哑剧型。

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

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

<强>编辑:

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

根据9.1.1. Normalize Request Parameters构建签名时,应考虑HTTP主体中的参数(使用&#34; application / x-www-form-urlencoded&#34;)和重复的参数名称。< / p>

但看起来OAuthParameters并未考虑方法&#34; computeSignature()&#34; (第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