2014-09-03 67 views
0

通常使用包含秘密令牌的授权头向Web服务进行身份验证。而且由于这个机制的安全性取决于令牌是秘密应该注意这个令牌不会泄露。如何使用angularJs安全设置授权标头?

Web上有无数的教程解释了如何使用角度设置授权头,并且至少实际读取的使用$ http拦截器,现在讨论令牌不会泄漏。

有一些公开的和一些私人的API可以通过CORS跨域交谈。显然,我不想在任何这些请求上发送内部授权令牌。

一些其他的技术浮现在脑海中,例如只在每个请求上手动设置标记,但这意味着大量重复的代码。 $ http服务器可以被包装在一个$ authenticatedHttp服务中,以便它始终可以从所使用的对象中显示,无论它是经过身份验证的服务还是普通的服务。然而,$ http服务有很多方法需要打包。

有没有更好的解决方案?

UPDATE

从我的印象中,我的问题是不被理解的答案。我尝试一个更具体的例子:

我有一个私人的网页。人们必须使用用户名/密码登录,并且为了简单起见,我们使用HTTP基本身份验证,因此用户名/密码是bas64编码的,并且在HTTP标头“授权”中的每个请求上传输。到目前为止没有问题。

但有这个伟大的&免费天气部件。我可以从https://myWhateverWeatherService.tld/weather.json获取JSON格式的当前天气信息。登录到我的私人网络服务后,我也检索天气信息(CORS允许我这样做)。

问题是,即使myWhateverWeatherService.tld根本不需要任何认证,angular的$ http服务仍然会追加授权标头。我不相信我的WhateverWeatherService.tld中的家伙。也许他们只是建立服务,以便他们可以窃取授权令牌,并与他们一起做很多讨厌的东西。

我需要一些可靠的方法来解决这个问题。我已经想过在拦截器中用一些正则表达式来检查url。这是可能的,但也不难忘记我的正则表达式会错过的特定情况。

回答

0

令牌总是通过电线发送,我想这是最脆弱的部分。

由于令牌必须始终存在于http头本身上,因此使请求更安全的唯一方法是加密整个请求,并且为此您应该使用SSL。

如果您担心在客户端计算机上存储令牌的安全性,您可以将其保存在浏览器的内存中,而不必将其保存在本地存储或类似的东西上。因此,每当用户关闭浏览器并再次打开浏览器时,他/她必须登录。

+0

“通过电话发送”的答案是SSL,这很容易。我想你误解了我的问题。请求头并不总是需要存在。它不应该出现在某些不受我控制的第三方服务器的请求中。 – yankee 2014-09-03 21:55:54

+0

你是对的,我完全错过了那部分。在这种情况下,避免将令牌发送给第三方的唯一方法是分开这些呼叫。如果它们比你自己的调用少,我建议你构建一个包装器,用基本方法去除头部,而不是检查每一个请求。因此,为了缩短这些事情,请使用带有拦截器的$ http作为您自己的可信端点,然后使用不带auth标头的包装器。 – Fedaykin 2014-09-04 00:11:36