我花了几个星期的时间试图绕过JWT对象。前提是有道理的,但我感到困惑的是安全方面。如果我是Javascript客户端(例如Firebase)并希望使用Open Auth向api发送安全请求,我会使用密钥加密我的邮件。但是,由于可以查看客户端源,因此如何保护我的密钥,以便恶意请求不会通过。我错过了什么。有没有办法保护钥匙?
答案 0 :(得分:4)
可以在OAuth协议中使用JWT来实现某些人可能称之为“Stateless Authentication”的内容,这意味着auth服务器将在成功验证后发出签名令牌(例如客户端应用程序或用户)(客户端或用户)没有存储关于它的信息,这在使用不透明令牌时是必需的。
您的JS客户端可以使用签名的令牌来例如调用某个REST-API端点(在所谓的资源服务器上),该端点将根据JWT的内容(声明)验证令牌的签名并授权您的请求。
两者,您的客户端应用程序以及资源服务器都能够内省令牌并验证其签名,因为它们与auth服务器(首先使用密钥签署令牌)具有共享密钥或者知道与auth服务器用于签署令牌的私钥相对应的公钥(正如Florent在评论中提到的那样)。
JWT也可以加密,如果资源服务器或auth服务器需要敏感信息但不想存储/访问数据,这很有用。只要您没有使用过的加密密码,就无法进行内省。
...长话短说,OAuth协议描述了针对资源或auth服务器的客户端身份验证。 JWT可用于传输身份验证(作为授权标头内的承载令牌)。但是,在OAuth流程中使用JWT的想法不是“向api发送安全请求”。
答案 1 :(得分:2)
使用收件人的公钥执行加密过程。 您的客户没有私钥来生成和管理。
如果您想接收和解密此类JWT,则您的客户端必须仅为会话创建密钥对(私有和公共),然后将该公钥与服务器进行交换。
答案 2 :(得分:0)
在构建api服务器时,我更喜欢客户端在自己的服务器上执行加密过程,然后发送加密数据。一切都在https下。
如果加密必须在网络客户端进行,我更喜欢关键是非常短暂的&基于时间,api服务器和客户端都有商定的特殊算法来再次生成该密钥。因此,如果密钥以某种方式被黑客入侵,攻击者就无法长期受益。