保护 Angular 应用程序

Securing Angular Application

我正在创建一个 Angular 应用程序,但我无法找到正确的方法来确保我的应用程序及其用户的安全。

我一直在阅读许多关于堆栈的讨论,但我相信我缺少对正在发生的事情的一些核心理解,请更正您在下面看到的任何错误。

到目前为止,我有一个 Sinatra 服务器,其中包含许多(目前大部分是假设的)资源路由。用户可以使用在使用 BCrypt 散列后存储在数据库中的电子邮件地址和密码来创建帐户。当用户登录时,通过电子邮件从数据库中检索记录,并检查密码以进行身份​​验证。从这一点开始,我不确定如何进行。

在此之前,我只是设置了一个会话变量,并让服务器检查该变量是否存在,以便正确路由登录用户。现在我的应用程序(当前)是单个 HTML 页面,它使用 Angular 和 ui-router 来显示不同的内容,因此大多数请求只是 returning JSON 内容.

据我了解,Restful 应用程序通常不应该使用会话,或者更确切地说,服务器应该对相同的请求做出相同的响应,并且没有自己的数据来形成响应。 但是如果我不在会话变量中存储一些东西,服务器怎么知道发出请求的客户端有正确的权限?而且会话是不是无论如何都没有存储在浏览器中,因此不是服务器的一部分?

我相信从我读到的内容来看,可以创建一个令牌,它本质上是一个大的随机字符串,return 将该字符串发送给客户端,并将其存储在带有时间戳的数据库中。然后,客户端在发出请求时提供此令牌,服务器会访问数据库以验证它是否存在且有效。但是客户端是否也不必将该字符串存储在 cookie 中?我想 angular 应用程序可以将令牌存储在一个变量中,该变量在使用 ui-router 时会持续存在,但如果用户使用地址栏导航则不会。

我也不明白 Basic Auth 可能适合或不适合这张图片。非常感谢任何帮助,以及指向一些好的资源的指针,我可以从中更好地理解这些概念。

您想继续阅读 JWT. There are JWT libraries for Ruby and Angular

我知道您没有将 Node 用于后端,但查看所有部分协同工作的一种非常简单的方法是 运行 angular-fullstack Yeoman 生成器。它使用 JWT,代码很容易理解。

您错过了 REST 概念的要点。 REST api 中的一个主要概念是服务器应该是无状态的——这意味着你不应该在你的网络服务器中存储会话或其他 "state"。每个 HTTP 请求都是在完全隔离的情况下发生的。每个请求都应包含服务器完成请求所需的所有数据。

But if I do not store something in a session variable, how could the server know that the client making the request has the correct permissions?

您可以存储请求范围的变量。这意味着它们应该只在同一个请求期间处于活动状态。您可以将当前登录的用户存储在请求范围变量中。通过这种方式,您可以在调用业务方法时获取当前用户。我不熟悉 Sinatra,但这是文档:http://www.sinatrarb.com/intro.html#Request/Instance%20Scope

But would the client not also have to store that string in a cookie?

当然你应该在客户端存储你的访问令牌 https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/

因为@Andy Gaskell 建议看一下 JWT 和全栈应用程序代码生成器并忘记基本身份验证,因为它真的是 "basic"。

更有用的链接:

If REST applications are supposed to be stateless, how do you manage sessions?

http://www.sitepoint.com/php-authorization-jwt-json-web-tokens/

据我所知,无论您在会话中做什么,都可以正常工作。

这可以是用户未登录时来自服务器的示例 JSON 响应:

{
"errorCode": 1,
"error": "User not logged in",
"data": {}
}

您可以设置自己的错误代码并处理您想要执行的操作。只有当用户登录时,你才会发送任何数据。对于所有不需要身份验证的页面,你可以将数据设置为任何你想要的。

在angularJS这边,可以根据错误代码进行处理,可以将用户重定向到登录页面等等。

在多个平台上支持相同的替代方法是使用基于令牌的方法。简单来说,基于令牌的方法就是这样工作的。

  1. 用户首次使用他/她的凭据登录。
  2. 服务器验证这些信息并创建一个令牌,服务器可以从中解码用户 ID。
  3. 每当客户端发出请求时,它都会在每个请求中传递其令牌。
  4. 由于服务器可以从令牌中解码用户信息,因此它会根据令牌是否正确发送或不发送数据。
  5. 令牌取决于一个秘密值。根据您要实现的方式,所有用户可以相同,也可以不同。

到此为止,大家可以看看 http://jwt.io/

正如@andy-gaskell 提到的,你可以看看 http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/

我很不擅长解释。如果其中任何一个没有意义,请告诉我。