App Engine Devserver提供了哪些用户

时间:2015-05-29 08:04:37

标签: google-app-engine oauth-2.0 google-oauth google-cloud-endpoints gae-userservice

App Engine的devserver在从UserServiceOAuthServiceCloud Endpoints Injection请求用户时提供了哪些用户?

2 个答案:

答案 0 :(得分: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(默认凭据)登录Devserver

    • userFromService返回userId = 185804764220139124118
    • userFromParameter返回userId = 0(提供oauth)
    • userFromOAuthService返回userId = 0

从端点返回null会导致http status = 204.Null是docs的正确端点行为。

  

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

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

  

在本地开发服务器上,oauth.getCurrentUser()始终返回一个User对象,其电子邮件设置为“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保护)通过端点生成与OAuth相同的用户。
  • 如果您的端点可能提供有效响应,即使未提供身份验证,也请使用用户注入
    • 您不能依赖OAuthService来指示是否未提供授权(在开发服务器上)

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

答案 1 :(得分:0)

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

您可以通过重定向到由UserService.createLoginUrl()回复的网址将用户重定向到登录页面 这在生产和开发服务器中同样有效。唯一的区别是dev服务器不验证用户凭据。它只要求发送电子邮件,不需要密码。