如何在Angular应用程序中存储身份验证令牌

时间:2014-05-21 03:23:40

标签: angularjs cookies local-storage access-token session-storage

我有一个与REST API服务器通信的Angular应用程序(SPA),我有兴趣找到存储从API服务器返回的访问令牌的最佳方法,以便Angular客户端可以使用它用于验证API的未来请求。出于安全原因,我想将其存储为浏览器会话变量,以便在浏览器关闭后不会保留令牌。

我正在使用资源所有者密码授予实现稍微自定义的OAuth 2.0版本。 Angular应用程序提供了一个表单,供用户输入其用户名和密码。然后将这些凭证发送到API以换取访问令牌,然后必须将其作为标头(授权:承载%令牌%)发送给API的所有出站请求,以便它可以授权对其他路由的请求。

我对Angular的领域相当新,但我想在处理这些令牌时实现的工作流程总结如下。

1)客户端向API提出请求,为其提供用户凭据。

2)如果此请求成功,则令牌存储在某处(问题在哪里)

3)拦截HTTP请求。如果设置了token,则将其作为标头传递给API

4)当浏览器/标签关闭时,标记会被销毁。

我知道Angular提供 $ window.sessionStorage ,这似乎是我正在寻找的,但我担心它根据各种资源不能在所有浏览器上工作我&# 39;读过。这是一个企业级应用程序,必须兼容各种浏览器(IE,Chrome,Firefox)。我能安全地使用它,并确信它会稳定吗?

根据我的理解,替代方案是$ window.localStorage或cookies($ cookies,$ cookieStore)。这对我来说不是一个理想的解决方案,因为我不希望这些数据持续存在,但如果这更可靠,我将不得不牺牲兼容性的效率。我也认为可以简单地将它设置为$ rootScope上的值并以这种方式引用它,但我不确定这是否可行。

我希望一切都有道理。任何帮助/建议将不胜感激。 谢谢!

2 个答案:

答案 0 :(得分:3)

如果您正在寻找一些肯定不会存在的东西,那么我只需将令牌保留在内存中,而不是依靠浏览器进行存储。但是,存储在rootScope中并不是最佳做法。

如果您还没有这样做,我建议您将服务器访问代码包装在Angular Service中。然后,您可以在运行时将您的令牌封装在该服务中(例如作为属性),而无需担心在从应用程序的其他部分进行调用时必须访问它。

Angular Services是单例,因此您的“服务器服务”将是一个可以使用普通依赖注入访问的全局实例。

答案 1 :(得分:3)

$window.sessionStorage是要走的路,除非您定位的是非常旧的浏览器。

根据www.w3schools.com会话支持IE 8.0,Chrome 4.0,Firefox 3.5和Safari 4.0。