2014-01-09 146 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