javascript - AngularJS SPA和RestfulAPI服务器安全性

标签 javascript angularjs authentication cookies ssl

快速背景:

与REstful API服务器对话的完整Javascript SPA AngularJS客户端。我正在尝试为API服务器制定最佳身份验证。客户端将担任角色,并且我不担心用户是否可以看到客户端区域,因为服务器应该是气密的,因此不允许他们访问。

身份验证流程:

  • 用户发布用户名和密码,例如/ api / auth
  • 如果用户是服务器,则服务器会生成api token (字段的哈希值或md5)和其他一些确定要传回角色的元数据)回复。
  • token 存储在 session cookie中(无exp,仅http,ssl)
  • 验证后的每个请求都将cookie中的 token 作为 token 并验证该用户。
  • 服务器上的SSL用户。

  • 问题:
  • 这是保护服务器安全的最佳方法吗?
  • 我是否需要担心带SSL的重播攻击?如果是最好的方式来解决这个问题?
  • 我试图考虑一种使用AngularJS进行HMAC安全的方法,但是我无法在javascript客户端上存储私钥。
  • 我最初使用了http身份验证方法,但是每个请求发送用户名和密码似乎很奇怪。

  • 任何建议或示例,将不胜感激。

    最佳答案

    我目前正在使用angularjs + node作为REST API并通过HMAC进行认证的类似情况。

    不过,我正在研究中,因此我的乐曲随时可能改变。这就是我所拥有的。任何愿意对此提出意见的人,我也欢迎:

  • 用户通过https认证,用户名和密码
  • 服务器(在我的情况下为node.js + express)将临时通用私钥发送回经过身份验证的用户。该密钥是用户用来在客户端HMAC上签名的密钥,存储在浏览器的LocalStorage中,而不是cookie(因为我们不希望它在每个请求中都来回移动)。
  • 密钥存储在nodejs内存中,每六个小时重新生成一次,并保留最后生成的密钥的记录。更改密钥后的10秒钟内,服务器实际上会生成两个HMAC。一个带有新密钥,一个带有旧密钥。这样,在更改密钥时发出的请求仍然有效。如果密钥更改,则服务器会将新密钥发送回客户端,以便其可以将其刷新到LocalStorage中。密钥是使用node-uuid生成的UUID的SHA256,并使用密码进行哈希处理。在输入完此内容后,我意识到这可能无法很好地扩展,但是无论如何...
  • 然后,该密钥存储在浏览器的LocalStorage中(如果不支持LocalStorage,则该应用程序实际上会吐出一个浏览器太旧的页面,甚至无法尝试登录)。
  • 然后,除了初始身份验证之外的所有请求都将发送三个自定义 header :
  • Auth-Signature:username + time + request.body(在我的情况下request.body是请求var的JSON.stringify()'d表示形式)的HMAC用本地存储的密钥
  • 签名
  • Auth-Username:username
  • X-Microtime:客户端生成其HMAC的unix时间戳
  • 然后,服务器检查X-Microtime header ,并且如果X-Microtimenow之间的间隔大于10秒,则将请求丢弃为潜在的重播攻击,并返回401。
  • 然后,服务器使用与客户端相同的顺序生成自己的HMAC,并使用节点内存中的6小时私钥生成Auth-Username + X-Microtime + req.body
  • 如果HMAC相同,则信任请求(如果不相同)(401)。如果需要处理API上特定于用户的任何内容,则具有Auth-Username header 。

  • 所有这些通信显然都打算通过HTTPS进行。

    编辑:

    在每次成功请求后,必须将密钥返回给客户端,以使客户端与动态密钥保持最新。这是有问题的,因为它基本上执行与cookie相同的操作。

    您可以将密钥设置为静态并且永不更改,但这似乎不太安全,因为密钥永不过期。您还可以为每个用户分配一个密钥,该密钥将在登录时返回给客户端,但是无论如何您仍然必须对每个请求进行用户查找,此时最好只使用基本身份验证。

    编辑#2

    因此,在做完一些我自己的测试之后,我决定使用仍使用HMAC的REST API的后端代理。
  • Angular连接到同域后端,后端从上方运行HMAC程序,此代理上存储的私钥。在同一个域上使用此属性可以阻止cors。
  • 成功进行身份验证后,angular只会获取一个标志,并且我们将登录状态存储在LocalStorage中。没有密钥,但是可以识别用户并且可以公开的东西。对我而言,此存储值的存在决定了用户是否登录。我们在用户注销时删除localStorage或决定使他们的“ session ”无效。
  • 从angular到同一域代理的后续调用包含用户 header 。代理检查用户 header (只能由我们设置,因为我们已经阻止了跨站点访问),如果未设置,则返回401,否则将请求转发至API,但如上所示是HMAC。 API将响应传递回代理,从而返回 Angular 。

  • 这使我们可以将专用位保留在前端之外,同时仍允许我们构建一个API,该API可以快速进行身份验证,而无需对每个请求进行DB调用,并且保持无状态。它还允许我们的API服务于其他接口(interface),例如本地移动应用程序。移动应用程序将仅与私钥 bundle 在一起,并针对其每个请求运行HMAC序列。

    关于javascript - AngularJS SPA和RestfulAPI服务器安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21540251/

    相关文章:

    Delphi XE2 DataSnap - 访问服务器方法模块中的 REST 连接属性

    javascript - 如何实现粘性表头和几列(每列都有复选框或输入)

    javascript - three.js OrbitControls 与 HTML5 Canvas 冲突?

    javascript - xhr javascript PUT 方法

    javascript - 为什么对象上的相等运算符返回 false?

    authentication - OAuth 2.0 服务到服务身份验证和最佳实践

    authentication - 如何区分 Microsoft MSA 和 AAD 帐户

    javascript - 使用字符串搜索在多维数组中查找坐标

    testing - 使用angularjs编写测试时如何处理重定向?

    javascript - AngularJS - 在选择的 ngOptions 上设置背景颜色