【问题标题】:User Authorization for Cloud EndpointsCloud Endpoints 的用户授权
【发布时间】:2014-01-09 13:43:32
【问题描述】:

我正在开发云端点后端,并希望将某些操作限制为管理员用户。

我当前的代码是这样工作的:

@ApiMethod(httpMethod = "PATCH", name = "item.update", path = "items")
public Item update(Item newObject, User user)
        throws UnauthorizedException, OAuthRequestException {
    OAuthService oAuthService = OAuthServiceFactory.getOAuthService();
    if (!oAuthService.isUserAdmin()) {
        throw new UnauthorizedException("Only admin users can modify content.");
    }
    ...
}

我知道应用引擎有用户角色的概念,但我很好奇 Endpoints 做。我试过使用 OAuthService.isUserAdmin() 调用,但没有 似乎工作得很好,文档有一个很大的旧警告说

注意:您不应将 Endpoints auth 与 auth for 非端点在配置设置一文中描述的 App Engine 网络应用 管理员中的https://developers.google.com/appengine/articles/auth 控制台,您还可以在其中指定用户登录要求 web.xmlhttps://developers.google.com/appengine/docs/java/config/webxml#Security_and_Authentication 文件。该方法与 Endpoints 一起使用。”

我是否必须自己创建某种授权,使用传递给更新方法的用户对象?有什么想法吗?

【问题讨论】:

    标签: java google-app-engine google-cloud-endpoints


    【解决方案1】:

    我也有类似的问题。事实上,OAuth 用户服务与 AppEngine 用户服务无关。我最终做的是在我的数据存储中拥有一个专用的用户类型实体,我在其中为每个用户存储一个特定的标志(常规/管理员)。当我使用 AppEngine 用户服务时,此标志会更新(即,我在控制台中指定的管理员可以获得正确的管理员标志)。

    在我的端点 API 中,我获取了当前用户 authDomain 和 id,在我的数据存储中查找以检查它是否具有 admin 标志。我的用户实体的密钥由“authDomain:userId”组成,因为我现在只支持谷歌用户,它看起来像 (gmail.com:123456789)

    这意味着管理员必须使用 AppEngine UserService 登录一次(即在我的情况下为专用网页),以便正确更新标志

    【讨论】:

    • 太好了。使用您的建议,我能够完成我需要的工作。我创建了一个 JSON servlet,它在web.xml 中对管理员角色进行了访问控制,它允许我从应用程序用户帐户中设置或删除管理员标志。这样我只需使用我的 App Engine 管理员帐户登录,并将用户帐户(我的)设置为管理员。我喜欢我不必硬编码任何东西或手动触摸数据来启动它。
    【解决方案2】:

    我需要做同样的事情并验证某些端点以仅授予项目控制台中列出的管理员成员访问权限并使用上面介绍的相同实现,但 oAuthService.isUserAdmin() 接受一个或多个字符串参数,此参数是您指定的范围,Oauth 用来获取用户信息,在我的例子中,我只是设置了这个参数,它就像下面的代码一样工作。

    OAuthService authService = OAuthServiceFactory.getOAuthService();
    User user;
    try {
      com.google.appengine.api.users.User currentUser =
          authService.getCurrentUser(Constants.EMAIL_SCOPE);
      if (currentUser != null && authService.isUserAdmin(Constants.EMAIL_SCOPE)) {
        user = new User(currentUser.getEmail());
        return user;
      }
    ...
    

    EMAIL_SCOPE 常量由

    定义
    public static final String EMAIL_SCOPE = "https://www.googleapis.com/auth/userinfo.email";
    

    在我的例子中,我实现了一个身份验证器,仅当它是管理员用户时才将用户信息传递给端点,如果需要,您可以阅读有关身份验证器的更多信息。 https://cloud.google.com/appengine/docs/java/endpoints/javadoc/com/google/api/server/spi/config/Authenticator

    【讨论】:

      猜你喜欢
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多