我将构建一个单页Web应用程序(使用Backbone js)并使其使用Restful API(在PHP中),我也要构建它。
我想知道如何处理我对API的用户身份验证并在用户请求某些数据时管理授权?
我知道一个宁静的api应该是无国籍的,但我已经陷入困境。
由于
答案 0 :(得分:1)
验证很简单。
您可以将会话作为资源处理:
POST /sessions {email, password}
-> {userId, token}
之后,您可以在http标头或cookie中发回令牌(最好在http标头中,因为它可以保护您免受CSRF攻击)。我的服务没有在请求标头中获得令牌,而是它可以发回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());
}