从UserService、OAuthService或Cloud Endpoints Injection请求用户时,App Engine 的开发服务器提供了哪些用户?
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 一直提供 userId=0
- 如果经过身份验证,UserService 提供 userId=185804764220139124118
- 如果授权,端点用户注入提供 userId=0,如果没有,则提供 null
细节
无身份验证,无 OAuth 授权
- userFromUserService 返回 null
- userFromParameter 返回 null
- userFromOAuthService 返回userId=0
API Explorer OAuth 授权(默认凭据)
- userFromService 返回 null
- userFromParmeter 返回 userId=0
- userFromOAuthService 返回 userId=0
通过 /_ah/login 登录开发服务器(默认凭据)
- userFromService 返回 userId = 185804764220139124118
- userFromParameter 返回 userId = 0(提供了 oauth)
- userFromOAuthService 返回 userId=0
从端点返回 null 会导致 http status = 204。 Null 是文档中正确的端点行为。
如果传入的客户端请求没有授权令牌或无效令牌,则 user 为空。在您的代码中,您需要检查用户是否为空,并根据条件执行以下操作之一: 1. 如果用户非空,则执行授权操作。2. 如果用户为null,则抛出OAuthRequestException。3. 或者,如果用户为空,如果需要某种未经授权的访问,则对未经授权的客户端访问执行一些操作。
OAuthService文档解释返回用户零是预期的行为。
在本地开发服务器上,oauth.getCurrentUser() 始终返回一个用户对象,其中电子邮件设置为“example@example.com”,用户 ID 设置为 0,无论是否发出了有效的 OAuth 请求。
返回两个帐户:
{
"email": "example@example.com",
"authDomain": "gmail.com",
"userId": "0",
"nickname": "example@example.com"
}
{
"email": "test@example.com",
"authDomain": "gmail.com",
"userId": "185804764220139124118",
"nickname": "test@example.com"
}
这些测试是使用 appengine-maven-plugin:1.9.21:devserver 运行的
结论
- 不要期望您的用户登录(受 web.xml 保护)通过 Endpoints 生成与 OAuth 相同的用户。
- 如果您有一个即使没有提供身份验证也可以提供有效响应的端点,请使用用户注入
- 您不能依赖 OAuthService 来指示是否未提供授权(在开发服务器上)
我回答了我自己的问题,但我会问为什么它需要如此混乱?
它们返回的用户对象对应于当前登录的用户。
我没有用户登录,他们将返回null
您可以通过重定向到返回的 url 将用户重定向到登录页面UserService.createLoginUrl()
这在生产和开发服务器中的工作方式相同。唯一的区别是开发服务器不验证用户凭据。它只要求电子邮件,不需要密码。