休息认证和授权

时间:2013-08-07 09:02:50

标签: php rest authentication restful-authentication

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

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

我知道一个宁静的api应该是无国籍的,但我已经陷入困境。

由于

1 个答案:

答案 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());
    }