我在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.oauth,com.google.appengine.api.users
Google OAuth是否(最不可能)出现错误?
答案 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它包含在不受支持的功能。