我正在创建一个Angular应用程序,我无法绕过正确的方式来确保我的应用程序及其用户的安全。
我一直在阅读很多堆栈讨论,但我相信我错过了对正在发生的事情的核心理解,请更正您在下面看到的任何错误。
到目前为止,我有一个Sinatra服务器,其中包含许多(当前大多数是假设的)资源路由。用户可以使用在使用BCrypt进行哈希处理后存储在数据库中的电子邮件地址和密码来创建帐户。当用户登录时,将通过电子邮件从数据库中检索记录,并检查密码以进行身份验证。从这一点来说,我不确定如何继续。
在此之前,我只需设置一个会话变量,并让服务器检查该变量是否存在,以便正确路由登录用户。现在我的应用程序(当前)是一个使用Angular和ui-router显示不同内容的HTML页面,因此大多数请求只是返回JSON内容。
我的理解是,Restful应用程序通常不应该使用会话,或者说服务器应该对相同的请求作出相同的响应,而不是有自己的数据来形成响应。 但是如果我不在会话变量中存储某些东西,那么服务器如何知道发出请求的客户端具有正确的权限?并且会话没有存储在浏览器中,因此不属于服务器
我相信从我读过的内容中,可以创建一个本质上是一个大型随机字符串的令牌,将该字符串返回给客户端,并将其存储在带有时间戳的数据库中。然后,客户端在发出请求时提供此令牌,服务器命中数据库以验证它是否存在且有效。但客户端是否还必须将该字符串存储在cookie中?我认为角度应用程序可以将令牌存储在变量中,该变量在使用ui-router时会保留,但如果用户使用地址栏导航则不会。
我也不明白Basic Auth如何适应或不适合这张照片。我将非常感谢任何帮助,以及指向一些优秀资源的指针,我可以在这些资源中更好地理解这些概念。
答案 0 :(得分:1)
我知道你没有在你的后端使用Node,但是看到所有部分协同工作的一个非常简单的方法就是运行angular-fullstack Yeoman生成器。它使用JWT,代码很容易理解。
答案 1 :(得分:1)
据我所知,无论你在会话中做什么都可以正常工作。
这可以是来自服务器的示例JSON响应,以防用户未进入:
{
"errorCode": 1,
"error": "User not logged in",
"data": {}
}
您可以设置自己的错误代码并处理您想要执行的操作。只有在用户登录时才会发送任何数据。对于所有不需要身份验证的页面,您可以将数据设置为您想要的任何数据。
在angularJS方面,您可以根据错误代码进行处理,您可以将用户重定向到登录页面等等。
在多个平台上支持相同的替代方法是使用基于令牌的方法。简单的基于令牌的方法以这种方式工作。
这一切都已完成,您可以查看 http://jwt.io/
正如@ andy-gaskell所说,你可以看一下 http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
我很难解释。如果这些内容没有任何意义,请告诉我。
答案 2 :(得分:0)
你忽略了REST概念的重点。 REST apis中的一个主要概念是服务器应该是无状态的 - 这意味着您不应该在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和fullstack应用程序代码生成器并忘记基本身份验证,因为它真的是“基本的”。
更有用的链接:
If REST applications are supposed to be stateless, how do you manage sessions?
http://www.sitepoint.com/php-authorization-jwt-json-web-tokens/