0

从UserServiceOAuthServiceCloud Endpoints Injection请求用户时,App Engine 的开发服务器提供了哪些用户?

4

2 回答 2

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 来指示是否未提供授权(在开发服务器上)

我回答了我自己的问题,但我会问为什么它需要如此混乱?

于 2015-05-29T08:04:36.533 回答
0

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

您可以通过重定向到返回的 url 将用户重定向到登录页面UserService.createLoginUrl()

这在生产和开发服务器中的工作方式相同。唯一的区别是开发服务器不验证用户凭据。它只要求电子邮件,不需要密码。

于 2015-05-31T07:15:49.847 回答