1

我将构建一个单页 Web 应用程序(使用 Backbone js)并使其使用我也必须构建的 Restful API(在 PHP 中)。

我想知道当用户请求一些数据时如何处理我对 API 的用户身份验证和管理授权?

我知道一个安静的 api 应该是无状态的,但我被困在这一点上。

谢谢

4

1 回答 1

1

认证很容易。

您可以将会话作为资源处理:

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());
    }
于 2013-09-08T00:54:25.680 回答