我將構建一個單一頁面的Web應用程序(包含Backbone js)並使其消耗一個我必須構建的Restful API(使用PHP)。Restful身份驗證和授權
我想知道如何處理我對API的用戶認證並在用戶請求某些數據時管理授權?
我知道一個安靜的api應該是無狀態的,但我堅持在這一點上。
謝謝
我將構建一個單一頁面的Web應用程序(包含Backbone js)並使其消耗一個我必須構建的Restful API(使用PHP)。Restful身份驗證和授權
我想知道如何處理我對API的用戶認證並在用戶請求某些數據時管理授權?
我知道一個安靜的api應該是無狀態的,但我堅持在這一點上。
謝謝
驗證很容易。
您可以處理會話作爲資源:
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());
}
注:如果您有多個交貨,而不是隻是休息(例如SOAP,Web應用程序,Flash等),那麼最好用域術語來描述授權邏輯,而不是使用URI等交付術語來描述) – inf3rno