【发布时间】:2013-08-08 13:48:56
【问题描述】:
我将构建一个单页 Web 应用程序(使用 Backbone js)并使其使用我也必须构建的 Restful API(在 PHP 中)。
我想知道当用户请求一些数据时如何处理我对 API 的用户身份验证和管理授权?
我知道 restful api 应该是无状态的,但我被困在这一点上。
谢谢
【问题讨论】:
标签: php rest authentication restful-authentication
我将构建一个单页 Web 应用程序(使用 Backbone js)并使其使用我也必须构建的 Restful API(在 PHP 中)。
我想知道当用户请求一些数据时如何处理我对 API 的用户身份验证和管理授权?
我知道 restful api 应该是无状态的,但我被困在这一点上。
谢谢
【问题讨论】:
标签: php rest authentication restful-authentication
身份验证很简单。
您可以将会话作为资源处理:
POST /sessions {email, password}
-> {userId, token}
之后,您可以在 http 标头或 cookie 中发回令牌(在 http 标头中更好,因为它可以保护您免受 CSRF 攻击)。我的服务没有在请求标头中获取令牌,而不是它可以发回 401 未经授权的响应。如果无法创建会话,可以发回 4** 请求,我用来发回 404 not found。
授权更难。
您必须决定授权系统的精细程度。它可以是 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());
}
【讨论】: