2015-06-14 57 views
0

我正在创建一个Angular应用程序,并且我无法围绕正确的方式来保证我的应用程序及其用户的安全。保护角度应用程序

我一直在阅读上许多栈的讨论,但我相信我的思念发生了什么事的一些核心的理解,请纠正你看到下面写的任何错误。

到目前为止,我有很多(目前主要是假设的)资源路由的西纳特拉服务器。用户可以使用电子邮件地址和密码创建一个帐户,该电子邮件地址和密码在与BCrypt进行哈希处理之后存储在数据库中。用户登录时,通过电子邮件从数据库中检索记录,并检查密码以进行身份​​验证。从这一点我不确定如何继续。

在此之前,我只是设置一个会话变量并有服务器检查该变量,以便存在正确路线在用户登录。现在我的应用程序(当前)是一个单独的HTML页面,它使用Angular和ui-router来显示不同的内容,所以大部分请求都只是返回JSON内容。

这是我的理解是RESTful应用程序一般不应使用会话,或者更确切地说,服务器应该相同,以相同的请求并没有塑造一个响应自己的数据。 但是,如果我不在会话变量中存储某些内容,服务器如何知道发出请求的客户端具有正确的权限?而且会话还没有存储在浏览器中,因此不是服务器的一部分?

我从我已阅读相信,就可以创建令牌基本上是一个大的随机字符串,该字符串返回到客户端,也将其存储在一个时间戳的数据库。然后,客户端在提出请求时提供此令牌,并且服务器命中数据库以验证其是否存在并且有效。但客户端是否也必须将该字符串存储在cookie中?我猜想角度应用程序可以将令牌存储在一个变量中,该变量在使用ui-router时会持续存在,但如果用户使用地址栏导航则不会。

我也不明白基本身份验证可能会或可能不适合这张图片。任何帮助将不胜感激,并指向一些优秀的资源,我可能会更好地理解这些概念。

回答

1

你想阅读JWT。有用于RubyAngular的JWT库。

我知道你并没有为你的后端使用Node,但是看到所有协同工作的一个非常简单的方法是运行Yeoman生成器angular-fullstack。它使用JWT,代码很容易遵循。

+0

谢谢我会研究它 – ErikAGriffin

+0

这正是我所期待的,文章也澄清了会话/ cookies。谢谢。 – ErikAGriffin

0

您错过了REST概念的要点。 REST API中的一个主要概念是服务器应该是无状态的 - 这意味着您不应该在您的Web服务器中存储会话或其他“状态”。每个HTTP请求都完全隔离。每个请求都应包含服务器完成请求所需的所有数据。

但如果我不是存储在一个会话变量,怎么可能 服务器知道发出请求的客户端有正确的 权限?

您可以存储请求范围的变量。这意味着它们应该只在相同的请求期间才有效。您可以将当前登录的用户存储在请求范围变量中。这样,您可以在调用业务方法时获取当前用户。我不熟悉西纳特拉,但这里是文档:http://www.sinatrarb.com/intro.html#Request/Instance%20Scope

但客户端不会也必须将该字符串存储在cookie中吗?

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

为@Andy加斯克尔建议看看JWT和fullstack应用代码生成器,忘了基本身份验证,因为它是真正的“基本”。

更多有用的链接:

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

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

+0

“这意味着你不应该将会话或其他'状态'存储在你的Web服务器中”。会话存储在客户端浏览器中,但对吗?您指的是存储在服务器中的什么状态 – ErikAGriffin

+0

不是,会话存储在Web服务器中。 –

1

据我所看到的,无论你是用你的会话做可以工作得很好。

这可以从服务器样本JSON响应的情况下,用户不loged:

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

您可以设置自己的错误代码和处理你想要做什么。只有在用户登录后才会发送任何数据。对于所有不需要验证的页面,您可以将数据设置为任何您想要的。

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

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

  1. 用户第一次用他/她的凭证登录。
  2. 服务器验证这些信息并创建服务器能够从中解码用户标识的令牌。
  3. 每当客户端发出请求时,它就会在每个请求中传递它的标记。
  4. 由于服务器可以解码来自令牌的用户信息,因此它根据是否是正确的令牌来发送或不发送数据。
  5. 令牌取决于一个秘密值。对于所有用户而言,它们可以相同,也可以根据您希望实施的方式而不同。

这是所有做,你可以看看 http://jwt.io/

正如@提到安迪 - 加斯克尔,你可以看看 http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/

我在解释非常糟糕。请让我知道这是否没有任何意义。