JSON Web令牌(JWT) - 验证客户端

时间:2015-07-02 16:41:40

标签: javascript json validation authentication jwt

我一直在调查JWT,我对使用它非常感兴趣。我喜欢它,由于数字签名和有效载荷内容,它不需要在服务器上进行状态检查。

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

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

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

有人可以帮助我绕过JWT的这一部分吗?

2 个答案:

答案 0 :(得分:3)

要添加到Tim B所说的内容,我已经使用了令牌,其中密钥具有浏览器AND ip,如下所示:( PHP示例)

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

这似乎有效,但是,如果您从网络到网络反弹,那么您每次都必须登录,在这种情况下,您可以只使用用户代理而不是IP。

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

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

答案 1 :(得分:2)

验证客户端是否受到损害是不可能的,因为它肯定会泄漏令牌。令牌过期有助于缓解泄露的令牌长时间处于危险状态,但正如您所提到的那样,这不是一个万无一失的解决方案。您可以使用请求用户的当前IP地址作为签名密钥的一部分来帮助减轻在其他地方使用的泄露令牌。它仍然可以通过本地XSS使用,但不像钓鱼者那样容易使用。

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