2013-08-07 242 views
1

我將構建一個單一頁面的Web應用程序(包含Backbone js)並使其消耗一個我必須構建的Restful API(使用PHP)。Restful身份驗證和授權

我想知道如何處理我對API的用戶認證並在用戶請求某些數據時管理授權?

我知道一個安靜的api應該是無狀態的,但我堅持在這一點上。

謝謝

回答

1

驗證很容易。

您可以處理會話作爲資源:

POST /sessions {email, password} 
-> {userId, token} 

之後,你可以(在HTTP頭更好,因爲它可以保護你免受CSRF攻擊)發回的令牌HTTP頭或cookie中。我的服務在請求標題中沒有得到令牌,比它可以發回401未授權的響應。如果你不能創建會話,你可以發回一個4 **請求,我用它發回404找不到。

授權比較困難。

您必須決定授權系統的細化程度。它可以是ACL,RBAC,ABAC,取決於您的應用程序和訪問規則的複雜程度。通常人們使用ACL和RBAC硬編碼像這樣(虛構的語言):

@xml 

    role 1 editor 

@/articles 

ArticleController 
    @GET/
    readAll() { 
     if (session.notLoggedIn()) 
      throw 403; 
     if (session.hasRole("editor")) 
      return articleModel.readAll(); 
     else 
      return articleModel.readAllByUserId(session.getUserId()); 
    } 

它正常工作,通過簡單的系統,但使用這種方法,你將永遠不會有乾淨的代碼,因爲訪問控制不應該是業務邏輯的一部分,你應該將其表面化。您可以使用ABAC系統執行此操作,例如使用XACML實現。 (XACML是一個偉大的工具,但我覺得它有點複雜。)您可以創建這種方法的自定義自動ABAC系統太(同樣的例子):

@db 

    role 1 editor 
     policy 1 read every article 
      constraints 
       endpoint GET /articles 
      permissions 
       resource 
       projections full, owner 

    role 2 regular user 
     policy 2 read own articles 
      constraints 
       endpoint GET /articles 
       logged in 
      permissions 
       resource 
       projections owner 


@/articles 

ArticleController 
    @GET/
    readAll() { 
     if (session.hasProjection(full)) 
      return articleModel.readAll(); 
     else if (session.hasProjection(owner)) 
      return articleModel.readAllByUserId(session.getUserId()); 
    } 
+0

注:如果您有多個交貨,而不是隻是休息(例如SOAP,Web應用程序,Flash等),那麼最好用域術語來描述授權邏輯,而不是使用URI等交付術語來描述) – inf3rno