2015-04-01 71 views
0

我想登录到Laravel5编写的RESTful后端服务器,单页前端应用程序利用Polymer的自定义元素。如何在Polymer SPA中保留后端会话信息

在这个系统中,持久性(CRUD)层位于服务器中。所以,认证应该在服务器端响应客户端的api请求。当请求有效时,服务器以JSON格式返回User对象,包括用户在客户端的访问控制角色。

在这里,我的问题是我如何保持会话,即使用户刷新前端页面?谢谢。

回答

1

这是聚合物以外的问题,甚至只是单页面应用程序。问题在于如何在浏览器中保留会话信息。使用SPA时,它会更容易一些,因为您可以将身份验证令牌保存在内存中,但传统的Web应用程序自一开始就有此问题。

你有你需要做两件事情:

  1. 令牌:您需要一个用户标记指示出该用户进行身份验证。你希望它成为不可猜测的东西,否则有人会欺骗它。所以这个标志最好不要是“jimsmith”,而应该更可靠。你有两个选择。您可以拥有服务器存储的随机生成的令牌,以便在将来的请求中提供该令牌时,可以验证该令牌。这就是大多数会话管理器在nodejs会话或Jetty会话等应用程序服务器中的工作方式。另一种方法是执行加密操作,以便服务器只需数学验证,而不检查存储以查看令牌是否有效。我在http://github.com/deitch/cansecurity中为节点做了这个,但是它有很多种选择。
  2. 存储:您需要某种方式来存储不依赖JS内存的令牌客户端,因为您希望重新加载页面。

有几种方法可以做客户端存储。目前最常见的是饼干。由于浏览器存储它们时没有太费劲,只要访问cookie注册的域名就可以显示它们,这很容易实现。许多客户端和服务器端auth库都是围绕它们构建的。

替代方案是html5本地存储。根据您的目标浏览器和支持,您可以考虑使用它。

还有一些方法可以使用URL参数进行播放,但当有人切换页面时,您可能会失去它。它可以工作,但我倾向于避免这种情况。

我还没有看到任何直接处理cookie的组件,但建立它不应该太难。

这是我用于最近的应用程序的cookie管理代码的要点。随意包装它建立一个cookie组件管理..只要你共享相同!

https://gist.github.com/deitch/dea1a3a752d54dc0d00a

UPDATE:

component.kitchen在这里有一个存储组件http://component.kitchen/components/TylerGarlick/core-resource-storage

+0

感谢您的解释和建议。 我明白了。 - ** option1 **:当index.html被命中以重新填充用户对象*时(只有当它被刷新命中时),客户端必须发出api请求。 - **选项2 **:客户端必须将用户对象存储在特定时间的某个地方。 – appkr 2015-04-02 13:26:16

+0

很高兴。很多,是的。我必须在接下来的几周内将一个Angular应用程序转换为Polymer,客户端存储是其中的重要组成部分,因此我们将看到它在现实世界中的表现如何。 – deitch 2015-04-02 13:50:31

0
如果您使用PHP是让用户在PHP会话(像一个正常的非SPA应用

的最简单方法)。 PHP会将用户信息存储在服务器上,并自动生成一个浏览器随任何请求发送的cookie。使用一台没有负载平衡的服务器,会话数据是本地的,速度非常快。

+0

谢谢!你是对的。我发现,即使是api请求,一旦登录到服务中,会话变量将通过COOKIE传递,并在Laravel 5中保留两个小时。因此,只要有后续的api请求服务器在两个小时内,COOKIE延长其使用寿命。 – appkr 2015-04-02 13:05:49

+0

但是,我也发现我写的题目很差。它应该类似于“在刷新客户端后保持从后端返回的用户数据”。这意味着,就api请求而言,一旦客户端得到认证,就没有限制做出另一个api请求。但是从服务器返回的用户对象不见了。 – appkr 2015-04-02 13:12:43

+0

我想有两种简单的方法可以做到这一点: - 服务器端:如果你的服务器主要是做REST请求,你可以在你的html页面直接在onload事件中发送用户对象,如果用户连接的话:(在你的内部html模板,使用类似window.onload = function(){user = {'从服务器生成的JS代码是一个用户连接'};} 我不知道Laravel,但如果你有某种模板引擎它可以在用户连接的每个HTML页面上显示一些JS,它可以工作在 - 客户端有会话存储(仅限HTML5浏览器)。详细信息请参阅deitch msg – BLASTOR 2015-04-03 22:06:26