验证JWT代币的角度



我的应用程序后端运行在Django Rest Framework上,前端运行在Angular上。

我已经在使用JWT进行身份验证,这很好。

我的要求是调用一个特定的API(与身份验证无关(,这将以纯文本形式为我提供一些详细信息。我不希望它是纯文本的,所以我想我应该创建一个JWT令牌,并将其作为响应发送,然后在前端使用密钥对其进行解码。

我使用jwt解码在没有秘密的情况下实现了解码部分。我担心的是,如果攻击者拦截了我的响应并修改了令牌,我该如何应对这种情况?

这就是我在角度中解码令牌的方式

try {
decoded = jwt_decode(token);
return decoded;
} catch (Error) {
return null;
}

有没有一种方法可以在Angular中用secret验证/解码我的代币?类似于:

data = jwt.decode(encoded_token, 'SECRET_KEY', algorithms=['algo']) # Python Code  

请引导我到这里来。如果有任何其他方法来实现我想要的,请让我知道

我不希望它是纯文本的,所以我想我应该创建一个JWT令牌并发送它作为响应,并在前端使用密钥对它进行解码。

JWT令牌通常是纯文本。JWT有两种类型——JWS(签名JWT(和JWE(加密JWT(。后者对内容进行了加密,因此除非有解密的密钥,否则任何人都无法读取。不过,加密很难配置和管理,所以JWE不经常使用。你需要一个非常有力的理由来使用JWE。签名JWT(JWS(更为常见。事实上,当人们使用JWT一词时,他们通常是指JWS。已签名的JWT受到完整性保护。使用签名,您可以验证JWT没有被攻击者更改,但它们是纯文本。任何人都可以阅读JWT的内容,只是不能修改它。

还要记住,Angular应用程序的所有代码都可供用户使用,这意味着它不能持有任何秘密。如果你在Angular应用程序中放入了一个秘密,那么任何人都可以读取该秘密,并使用它来解密你的JWE,或者伪造新的JWS,如果你使用对称签名(例如HS256算法(。

我在没有秘密的情况下使用jwt解码实现了解码部分。我担心的是,如果攻击者拦截了我的响应并修改了令牌,我该如何应对这种情况?

如果你担心中间人攻击,这样有人会修改你服务器的响应,那么你只需要一个HTTPS连接。如果你使用HTTPS连接到API,那么你确定没有人修改响应,也没有人读取它

如果你担心HTTPS终止后你的响应会被修改(例如浏览器中运行的恶意代码(,那么你可以使用JWS来确保响应的完整性。你只需要记住使用非对称签名,这样Angular应用程序就只保留公钥。

我不知道你在Angular中使用的JWT的哪个库,但我认为它们都能够验证签名,所以这应该不是问题。

最新更新