我将构建一个单页 Web 应用程序(使用 Backbone js)并使其使用我也必须构建的 Restful API(在 PHP 中)。
我想知道当用户请求一些数据时如何处理我对 API 的用户身份验证和管理授权?
我知道一个安静的 api 应该是无状态的,但我被困在这一点上。
谢谢
我将构建一个单页 Web 应用程序(使用 Backbone js)并使其使用我也必须构建的 Restful API(在 PHP 中)。
我想知道当用户请求一些数据时如何处理我对 API 的用户身份验证和管理授权?
我知道一个安静的 api 应该是无状态的,但我被困在这一点上。
谢谢
认证很容易。
您可以将会话作为资源处理:
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());
}