2015-07-02 158 views
2

我一直在调查智威汤逊,我对使用它非常感兴趣。由于数字签名和有效负载内容,我喜欢它不需要服务器上的状态检查。JSON Web令牌(JWT) - 验证客户端

我遇到困难的事情是验证客户端。我知道签名允许服务器说“是的,我发出了这个令牌,它是有效的”,但我并不完全理解服务器如何验证客户端是谁说的。

数字签名在服务器端是有意义的,但客户端无法签署任何内容来验证它是谁,因为浏览器无法保守秘密。这是我无法包裹头部的一部分。如果浏览器无法保密,那么它如何将数据添加到令牌中(如随机数或有关所请求资源的信息)以包含在签名中,类似于oAuth 1.0的工作原理。

这不支持?有没有其他的方式来验证浏览器是谁说的?如果我的客户有一个泄漏令牌的安全漏洞会怎么样?如果客户端未通过验证,任何人都不能使用这些令牌?我不认为“短期到期”是解决这个问题的好办法。

有人能帮我把我的头围绕JWT的这部分吗?

回答

2

验证客户端是不是真的可能,因为它肯定会泄漏一个令牌。令牌过期有助于缓解泄漏的令牌危险时间过长,但正如您所提到的,这不是一种无懈可击的解决方案。您可以使用请求用户的当前IP地址作为签名密钥的一部分,以帮助减轻其他地方使用的泄漏令牌的影响。它仍然可以通过XSS在本地使用,但不容易被钓鱼者使用。

我的理解是,客户端不会将信息添加到令牌,它只会将其传递到附加信息旁边。单独的POST变量 - 一个令牌来“验证”身份,其他变量定义额外的参数。

+0

嗯,我没有想过使用与客户端相关的秘密,这是一个好主意。 Oauth 1.0a通过让“客户端”(实际上是另一台服务器)对其整个请求进行签名来处理此问题。在浏览器中没有办法做到这一点,但我喜欢使用来自客户端的动态秘密的想法。 – BeniRose

2

要添加到什么添乙说,我已经使用令牌,其中密钥后有像这样的浏览器和IP:但是(PHP例)

$secret_key = 'kajsdfkljk' . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']; 

但这似乎工作, ,如果你从网络到网络反弹,那么你将不得不每次登录,在这种情况下,你可以使用用户代理而不是IP。

这里需要注意的另一件事是,如果有某种泄漏,您可以随时更改密钥,其中从服务器发出的所有令牌都不再有效。

另外,如果不使用https连接,令牌可能会非常危险地用于身份验证。

+0

“另外,如果不使用https连接,令牌可能会非常危险地用于身份验证” - 这同样适用于使用会话公平。如果不使用HTTPS,您无法安全地进行Web身份验证。 – Delosdos