2014-01-09 107 views
3

我工作的一个云终端后端并希望限制对管理用户的某些操作。用户授权云端点

我当前的代码是这样的:

@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."); 
    } 
    ... 
} 

我知道应用程序引擎具有用户角色的概念,但我很好奇,如果端点 做。我已经使用OAuthService.isUserAdmin()调用尝试,但不是 似乎是工作得非常好和文档有一个大的老警告说

注:你不应该混淆身份验证的端点与身份验证有关的配置设置 https://developers.google.com/appengine/articles/auth管理 控制台,在这里你还你 的web.xml https://developers.google.com/appengine/docs/java/config/webxml#Security_and_Authentication 文件中指定的用户登录需求的文章中描述 非端点 App Engine的Web应用程序。这种方法是与端点使用。”

我必须建立某种形式的授权我使用则传递到更新方法User对象?有什么想法?

回答

3

我有类似的问题事实上的OAuth用户服务无关与AppEngine上的用户服务。我最终什么事做了具有数据存储区为每个用户专用的用户类型的实体在哪里存储特定标志(普通/管理员)。这个标志被更新时,我使用AppEngine上的用户服务(即,使得我在控制台中指定的管理员取得正确的管理标志)。

在我的终端API中,我得到当前用户的authDomain和id,在我的数据存储中查找它是否有管理标志。我的用户实体的关键是由“authDomain:userId”组成,因为我现在只支持google用户,它看起来像(gmail.com:123456789)

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

+0

这是伟大的。我能够用你的建议完成我所需要的。我在'web.xml'中创建了一个JSON servlet给管理员角色,允许我从应用程序用户帐户设置或删除管理员标志。这样我只需使用我的App Engine管理员帐户登录,并将用户帐户(我的)设置为管理员。我喜欢我不必硬编码任何东西或手动触摸数据来启动它。 – rharter

0

我需要做同样的事情,并验证一些端点只授予在项目控制台中列出的管理员成员访问和使用提出了同一个实现以上,但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