【问题标题】:Restful authentication and authorizationRESTful 认证和授权
【发布时间】:2013-08-08 13:48:56
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: php rest authentication restful-authentication


    【解决方案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());
        }
    

    【讨论】:

    • 注意:如果您有多个交付,而不仅仅是 REST(例如 SOAP、Web 应用程序、flash 等),那么最好用领域术语来描述授权逻辑,而不是用交付条款,如 URI 等...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 2010-11-14
    • 2021-11-08
    • 2017-09-11
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多