Authentication 什么';s管理身份验证(会话)的最佳设计/体系结构实践&;backbone.js应用程序中的授权

Authentication 什么';s管理身份验证(会话)的最佳设计/体系结构实践&;backbone.js应用程序中的授权,authentication,backbone.js,authorization,Authentication,Backbone.js,Authorization,我在任何地方都找不到这方面的内容。大多数示例应用程序都不涉及安全性等问题。假设用户将使用基于rest的API调用进行身份验证。应用程序的结构应如何处理身份验证[以及授权]。一个指向示例应用程序的指针就好了。请按单页应用程序和普通应用程序添加视图。 [我相信每个观点都应该考虑它]我同意穆的评论。关于身份验证,几乎没有什么可谈的 如何使用发回服务器的标准HTML应用程序处理身份验证?这样做,因为这是应该做的 关于授权,有更多的讨论,但不多。本质上,您只向用户发送允许他们看到的内容。除非绝对需要,否则

我在任何地方都找不到这方面的内容。大多数示例应用程序都不涉及安全性等问题。假设用户将使用基于rest的API调用进行身份验证。应用程序的结构应如何处理身份验证[以及授权]。一个指向示例应用程序的指针就好了。请按单页应用程序和普通应用程序添加视图。
[我相信每个观点都应该考虑它]

我同意穆的评论。关于身份验证,几乎没有什么可谈的

如何使用发回服务器的标准HTML应用程序处理身份验证?这样做,因为这是应该做的

关于授权,有更多的讨论,但不多。本质上,您只向用户发送允许他们看到的内容。除非绝对需要,否则不能在浏览器中执行授权或身份验证代码。在我的经验中,这从来不是绝对需要的

浏览器中的JavaScript不安全,因此不要在浏览器中执行依赖于身份验证和授权的操作


我在这里写了一篇关于这方面的小文章:

您完全正确,大多数示例根本不涉及安全性。因此,我没有一个很好的样本可以给你们指出。我只能告诉你我们是如何构建自己的东西的:

  • 正如您所建议的,我们进行API调用以验证用户。在里面 在我们的案例中,Java服务器很快就创建了一个会话ID 当用户点击第一页(甚至在登录之前)并存储 在cookie客户端中。因为那块曲奇会随着每一个 对服务器的HTTPS请求(甚至是AJAX调用以获取数据或 执行命令)它与特定帐户服务器关联 一旦用户进行了身份验证,则返回

  • 假设到服务器的传输是HTTPS和cookie 永远不要在开放的互联网上旅行,没有人可以偷听 值并假装为登录用户

  • 在我们的例子中,服务器是基于Java的,servlet过滤器位于所有服务器的前面 不可公开访问的API函数(即 需要登录的)。它会检查会话并确保它 表示将请求传递给服务之前已登录的用户 这使得服务代码不受身份验证的影响 检查。但是,授权代码和参数验证当前不可用 坐在服务层

  • 对API的AJAX调用可能无法进行身份验证,即使您这样做了 出于各种原因,随身携带一块饼干 会话已过期,必须重新启动服务器,并且 忘记了用户的会话,管理员强制注销了 用户等)。在我们看来,服务器仍然 返回某个内容(即,不是空响应),它不应该是空的 类似于重定向到 登录页面(对于AJAX请求来说是无用的)。所以我们总是 返回所有函数的响应,如果 用户未登录,则servlet过滤器返回标准JSend“错误” 使用特定代码进行响应。这使我们能够拥有客户端代码 (你可以说 进入自定义同步)注意用户未登录,并提示登录。它是 甚至可以在他们登录后自动重试该功能,但这是不可能的 比我们现在更复杂

  • 通过同步通知用户未登录或发生安全违规 您不必在视图中添加任何特殊内容。他们只是提出任何要求 他们认为这是恰当的,要么成功,要么失败。如果需要新的登录名 需要时,会在较低级别触发

  • 注销实际上并不要求您终止本地cookie 只要服务器将给定会话标记为不再记录 或丢弃会话记录

  • 我有点不同意德里克关于客户不应该知道安全性的说法。我认为它需要知道何时提示登录,如何告诉服务器何时执行注销,并且我始终认为在客户端进行额外检查是一个好主意,以避免意外的原则。例如,如果我不能使用管理函数,我希望客户端禁止向我显示它们,而不是允许我尝试调用它们,然后在响应中得到错误


    最终,服务器必须在每次请求时再次检查用户的权限(因为避开客户端安全非常容易),但是好的用户体验要求客户端知道我不是管理员,这样它就可以为我呈现最佳的用户界面表现。

    几个月前,在使用基于REST的api的单页应用程序中遇到了同样的问题。在搜索答案后,我想到的是使用HTTP现有的401和403错误。我让api返回这些错误。然后通过使用扩展的错误处理模型来处理这些错误来捕获异常,并通过路由器功能将它们路由到我的登录名

    var ErrorHandlerModel = Backbone.Model.extend({
    
        initialize: function(attributes, options) {
            options || (options = {});
            this.on("error", this.errorHandler);
            this.init && this.init(attributes, options);
        },
    
        errorHandler: function(model, error) {
            if (error.status == 401 || error.status == 403) {
              app.history.navigate('login', true);
            }
        }
    
    });
    
    但事后看来,我认为使用全局jquery函数会更好。上面的片段是基于几个月前的一个类似例子

    我还必须重写backbones的默认获取行为,这样我就可以用ogin触发一个错误,以捕获api的json响应中包含的响应变量

    var Login = Backbone.Model.extend({  
    
        urlRoot: '/login',
    
        parse: function(resp,xhr) {
            if (resp.response == 'success') {
                app.history.navigate('dashboard', true);
            }
            else {
                this.trigger('loginError');     
            }
        return false;
        }
    });
    

    示例应用程序不谈论安全性,因为没有什么(如果有的话)主干特定于讨论。为了让我更清楚,我对在不损害安全性的情况下应用的身份验证/授权模式感兴趣。e、 g.我是否应该使用中介模式来保存会话/授权信息,并且每个视图都应该在呈现之前检查这些信息。还是应该用其他方法来解决这个问题