验证JWT令牌签名

deh*_*len 1 rsa ios jwt swift vapor

我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我得到一个身份令牌(访问令牌),它是Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。

在服务器上,我想验证发送的令牌确实由Apple签名,并且不是某些恶意用户通过验证令牌签名专门制作的。Apple提供了一个HTTP端点来检索执行此操作的公共密钥:Apple文档

但是,我不确定必须多久查询一次此端点以从API检索模数和指数并构建公钥,然后验证签名。是否足以查询一次并在服务器上存储公用密钥以使用它,还是我需要在验证签名(针对每个受保护的路由)之前查询中间件中的HTTP端点?

基本上我不确定模数和指数是否会不时变化。

小智 5

您可以这样做:

  • 一次获取公用密钥,并将其存储在服务器上
  • 收到请求,请尝试使用存储的公钥来验证签名
  • 如果失败,请再次获取公共密钥,并将其存储
  • 尝试再次验证签名

这样,您可以在必要时立即知道已更改的公钥。

  • 再补充一点,假设有 10 个用户使用 key1 对他们的 JWT1 进行签名。然后苹果将他们的密钥更改为 key2。然后说其他十个用户使用 key2 对他们的 JWT2 进行签名(此时您的系统中仍然有 key1)。假设现在用户使用 JWT2,那么您的验证将失败,您将从苹果获取公钥并重试,这将检查出来。现在假设有 10 个用户向您发送 JWT1,这意味着您最终将从 Apple 获取 10 次并且每次都失败。因此,您可能希望将从 Apple 获得的所有各种密钥存储在您的数据库中 (3认同)