回答

2

部署在一个端点项目这个API类:

import com.google.api.server.spi.Constant; 
import com.google.api.server.spi.config.Api; 
import com.google.api.server.spi.config.ApiMethod; 
import com.google.appengine.api.oauth.OAuthRequestException; 
import com.google.appengine.api.oauth.OAuthServiceFactory; 
import com.google.appengine.api.users.User; 
import com.google.appengine.api.users.UserServiceFactory; 

@Api(clientIds = Constant.API_EXPLORER_CLIENT_ID) 
public class AuthEndpoints { 

@ApiMethod 
public User userFromUserService() { 
    return UserServiceFactory.getUserService().getCurrentUser(); 
} 

@ApiMethod 
public User userFromParameter(User user) { 
    return user; 
} 

@ApiMethod 
public User userFromOAuthService() throws OAuthRequestException { 
    return OAuthServiceFactory.getOAuthService().getCurrentUser(); 
} 
} 

摘要

  • OAuthService提供用户id = 0的所有时间
  • UserService提供用户id = 185804764220139124118如果认证
  • 终端用户注入如果授权,则提供userId = 0,如果不是,则为空

详细

  • 不认证,不OAuth授权

    • userFromUserService返回null
    • userFromParameter返回null
    • userFromOAuthService返回用户id = 0
  • API资源管理器的OAuth授权(默认凭证)

    • userFromService返回null
    • userFromParmeter返回用户id = 0
    • userFromOAuthService返回用户id = 0
  • Devserver登录via/_ah/login(默认凭证)

    • userFromService返回用户id = 185804764220139124118
    • userFromParameter返回用户id = 0(提供的OAuth)
    • userFromOAuthService返回用户id = 0

从http状态= 204端点的结果返回空。空是每个docs的正确端点行为。

如果传入的客户端请求没有授权令牌或无效授权令牌,则用户为空。在您的代码中,您需要检查用户是否为空,并根据条件执行以下操作之一: 1.如果用户非空,请执行授权操作。 2.如果用户为空,则抛出OAuthRequestException。 3.或者,如果用户为空,则在需要进行某种未经授权的访问时,对未经授权的客户端访问执行某些操作。

OAuthService docs解释返回用户零是预期的行为。

在本地开发服务器,oauth.getCurrentUser()总是返回一个用户对象与电子邮件设置为“[email protected]”和用户ID设置为0,而不管有效的OAuth请求是否被制成。

两个帐户返回:

{ 
"email": "[email protected]", 
"authDomain": "gmail.com", 
"userId": "0", 
"nickname": "[email protected]" 
} 

{ 
"email": "[email protected]", 
"authDomain": "gmail.com", 
"userId": "185804764220139124118", 
"nickname": "[email protected]" 
} 

这些测试使用AppEngine上,Maven的插件运行:21年9月1日:devserver

结论

  • 不要指望您的用户登录名(受web.xml保护)与通过终端节点的OAuth生成相同的用户。
  • 使用用户注射,如果你有一个端点可以提供即使不提供身份验证的有效响应
    • 你不能依靠OAuthService,表示如果提供(开发服务器上)
    没有授权

我回答了我自己的问题,但我会问为什么它需要这个混淆?

0

它们返回与当前登录用户对应的用户对象。
我没有用户登录,他们将返回null

您可以将用户重定向通过重定向到URL由UserService.createLoginUrl()

这工作在生产和开发服务器相同retured到登录页面。唯一的区别是dev服务器不验证用户凭证。它仅要求电子邮件,不需要密码。

相关问题