2014-02-23 24 views
1

我有一个angular.js单页面应用程序,它针对RESTful API(Servicestack)进行身份验证。这一切工作正常。当返回来自认证api的响应时,用户名将存储在Angular服务中,并且isAuthenticated标志将设置为true。浏览器刷新 - 丢失的服务堆认证会话数据

任何针对[验证]属性的Web服务的请求都会返回数据。

我的问题是,当我刷新浏览器时,我的JavaScript角对象被刷新,用户身份验证的事实被遗忘。然而,当我打电话给[验证]归属服务,他们工作正常,因为会话仍然是活...

道歉的相当noob问题,但浏览器如何传递会话到Web服务时,JavaScript对象已破坏和重建?我如何在刷新时获取相同的会话,并使用用户名等设置我的Angular服务?

+0

有什么我可以添加,使这个问题更容易回答?我很高兴展示代码,但考虑到这个问题并不认为它特别相关。 – Drammy

回答

3

默认情况下,ServiceStack身份验证使用Cookie来存储会话令牌。这意味着当您首次登录时,您的Angular应用程序将收到Cookie。它将通过此​​传递给后续请求,并且在会话在服务器上仍然有效时它们将成功。

问题在于当你刷新页面时,Angular将失去对象状态,即告诉它你有一个活动会话。所以你必须将这些知识恢复到Angular。有两种方法来解决这个:

  1. 检查的ss-id cookie时,你的应用程序启动和假设你有一个有效的会话。换句话说,如此恢复到登录状态,直到您从服务器收到401错误。这是最快的方法,如果有人刷新页面,不需要额外的开销来检查会话。

  2. 检查ss-id cookie并进行测试验证请求以检查会话是否仍然有效。

如果您需要恢复的其他信息,如登录的用户名等的电流,那么你就需要存储在cookie /本地存储到它刷新恢复,或与方法2去,从服务器上取回它。

您可以使用$cookies provider来管理会话cookie。

+0

所以这意味着我必须通过脚本使ss-id可访问 - 当我查看cookie时它是HttpOnly ..? – Drammy