【问题标题】:Securing Angular Application保护 Angular 应用程序
【发布时间】:2015-06-15 00:20:23
【问题描述】:

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

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

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

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

据我了解,Restful 应用程序通常不应该使用会话,或者更确切地说,服务器应该以相同的方式响应相同的请求,并且没有自己的数据来形成响应。 但是,如果我不在会话变量中存储某些内容,服务器如何知道发出请求的客户端具有正确的权限? 而且会话是否无论如何都没有存储在浏览器中,因此不属于服务器?

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

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

【问题讨论】:

    标签: angularjs rest security session sinatra


    【解决方案1】:

    您想阅读JWTRubyAngular 有 JWT 库。

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

    【讨论】:

    • 谢谢,我会调查一下
    • 这正是我要找的,文章还澄清了会话/cookies。谢谢。
    【解决方案2】:

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

    如果用户未登录,这可以是来自服务器的 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/

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

    【讨论】:

      【解决方案3】:

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

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

      您可以存储请求范围的变量。这意味着它们应该仅在同一请求期间处于活动状态。您可以将当前登录的用户存储在请求范围变量中。通过这种方式,您可以在调用业务方法时获取当前用户。我不熟悉 Sinatra,但这里是文档: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 Gaskell 建议的那样,看看 JWT 和全栈应用程序代码生成器,忘记基本身份验证,因为它真的很“基本”。

      更多有用的链接:

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

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

      【讨论】:

      • “这意味着您不应该在您的网络服务器中存储会话或其他“状态””。会话存储在客户端浏览器中,对吗?您指的是存储在服务器中的什么状态
      • 不,会话存储在网络服务器中。
      猜你喜欢
      • 2018-11-04
      • 2017-04-14
      • 2015-08-12
      • 2021-06-25
      • 2021-10-26
      • 2017-02-27
      • 2010-12-15
      • 2011-04-06
      • 2011-10-12
      相关资源
      最近更新 更多