2011-03-23 42 views
1

我目前正在開發一個在Google App Engine/Java上使用RESTlet的小型項目。RESTlet + GAE/J上的自定義登錄和註冊?

我在搜索..搜索..並找不到確切或可以理解的解決方案,我的疑惑。

我的問題是,我想如何實現我自己的SignIn & SignUp模塊,而不使用谷歌的UserService或Spring Security?

是否有任何實際的樣本代碼?

我的意思是SignUp部分只是一個簡單的JDO插入&選擇模塊。讓我們說我已經做到了。

我該如何處理每個用戶的請求會話和認證?

我想在每個請求上使用HTTPS。

任何建議或幫助將非常感激!

在此先感謝。

+0

添加一些更多的解釋,我有一個iPhone或Android應用程序在客戶端和服務器端我使用谷歌appengine與客戶端一起工作。 – jlc488 2011-03-23 15:15:58

+0

,我希望這個客戶端登錄並註冊自己的社交賬戶信息,如Facebook,雅虎,微博等。 – jlc488 2011-03-23 15:17:21

+0

它與任何這些網站登錄後,我希望這個客戶端訪問GAE上的RESTlet資源。謝謝。 – jlc488 2011-03-23 15:19:02

回答

1

在Restlet中,您在客戶端和服務器端都有安全支持。在客戶端,您可以使用ChallengeResponse實體指定安全提示。此功能已打開,您可以指定所需的身份驗證類型。在下面的代碼,我使用基於用戶名/密碼的HTTP基本認證:

ClientResource cr = new ClientResource(uri); 
ChallengeScheme scheme = ChallengeScheme.HTTP_BASIC; 
ChallengeResponse authentication = new ChallengeResponse(
          scheme, "username", "password"); 
cr.setChallengeResponse(authentication); 

的Restlet將自動建立必要的標頭中的相應請求。您可以注意到,Restlet通過其擴展支持多種身份驗證類型。我知道目前有一些工作可以支持OAuth v2(請參閱http://wiki.restlet.org/developers/172-restlet/257-restlet/310-restlet.html)。

在服務器端,您需要使用ChallengeAuthenticator實體在路由級別保護訪問,如下所述。這可以在你的Restlet應用程序內完成:

public Restlet createInboundRoot() { 
    Router router = new Router(getContext()); 

    ChallengeAuthenticator guard = new ChallengeAuthenticator(getContext(), 
             ChallengeScheme.HTTP_BASIC, "realm"); 
    guard.setVerifier(verifier); 
    guard.setEnroler(enroler); 

    guard.setNext(router); 
    return guard; 
} 

像客戶端,這種支持是通用的,是基於需要在保護指定的兩個接口:

  • 驗證者之一檢查,如果認證成功
  • 的enroler一個填補角色的身份驗證的用戶

你可以注意到,同樣的安全技術必須是在兩邊使用...

如果您想管理用戶的身份驗證會話,則需要使用cookie自行實施。

當服務器端的認證成功時,您可以返回一個包含安全令牌的cookie,以允許您從數據庫中檢查用戶(例如)。像下面的一些代碼可以實現:

CookieSetting cookie = new CookieSetting(0, 
       SECURITY_COOKIE_NAME, securityToken); 
Series<CookieSetting> cookieSettings = response.getCookieSettings(); 
cookieSettings.clear(); 
cookieSettings.add(cookie); 

可以擴展例如SecretVerifier類的Restlet的增加對接收的安全數據的測試和接收安全cookie時添加此代碼。

在客戶端,你需要添加提示進行身份驗證的第一次,然後重新發送安全Cookie以下時間,如下所述:

ClientResource clientResource = (...) 
(...) 
Cookie securityCookie = new Cookie(0, 
      SECURITY_COOKIE_NAME, securityToken); 
clientResource.getRequest().getCookies().clear(); 
clientResource.getRequest().getCookies().add(securityCookie); 

希望它會幫助你的! Thierry