Isa*_*122 2 authentication jwt next.js
最近在学习JWT。
我计划在 Next.js 服务器上采用 JWT,并使用发出 JWT 访问令牌的外部身份验证服务器。
起初我在考虑以下逻辑(当影响数据时)
但我认为这是非常低效的。
然后我看到一篇博客文章说:
“JWT 比其他基于令牌的身份验证解决方案更好,因为它不会向身份验证服务器发出进一步的验证请求,而是微服务本身验证令牌的有效性”
但是没有密钥就不可能验证 JWT 令牌吗?
如果是这样,在许多不同的微服务中存储 JWT 密钥是否安全?(我使用 dotenv 来存储密钥)
最近在学习JWT。我计划在 Next.js 服务器上采用 JWT,并使用发出 JWT 访问令牌的外部身份验证服务器。起初我在考虑以下逻辑(当影响数据时)
我想起了这句话“当你唯一的工具是锤子时...... ”。
(为了清楚起见,我通过添加 OAuth/OIDC 规范中的常用术语来调整您的事件序列)
- 客户端使用 JWT 访问令牌发送请求(并等待 RP 的响应)。
- 某个外部服务器(RP)接收该请求
- RP 将 JWT 访问令牌发送到颁发 JWT 令牌的身份验证服务器 (IdP) 进行验证
- RP根据步骤3中IdP的响应拒绝或接受客户端的请求,并完成步骤1中客户端的请求。
但我认为这是非常低效的。
没错,就是效率低下。
您所描述的是RP 和 IdP 之间存在反向通道通信。
作为括号:请注意,JWT 通常不会加密,因为JWT 中的任何声明本身都不应该是“秘密”值(但如果绝对需要,您可以加密 JWT );另请注意,如果您不是 IdP,则您无法控制此情况;另请注意,某些方案和系统可能要求 JWT 未加密,但这是另一个问题)。
关于 JWT 签名的一些背景故事:
RP 需要能够知道它可以信任来自 IdP 的 JWT 中的声明:这是通过让 IdP 对 JWT 进行加密签名并确保 RP 可以以某种方式验证该签名来确保的。
然后 RP 可以通过以下任一方式验证签名:
在运行良好的分布式系统中,系统之间的依赖性应该最小,因此第二个选项(将验证委托给 IdP)是不可取的,因此我们应该更喜欢第一个选项 - 并且第一个选项不需要使用对称密钥(必须保密)。
然后我看到一篇博客文章说“ JWT 比其他基于令牌的身份验证解决方案更好,因为它不会向身份验证服务器发出进一步的验证请求,而是微服务本身验证令牌的有效性”
事实实际上要复杂得多:您读到的文章是一个不幸的例子,有人将广泛和具体的术语混合在一起并得出不准确(且不完整)的结论(特别是暗示 JWT 是唯一支持分布式非对称的方案)加密签名,因为它不是)。
但是没有密钥就不可能验证 JWT 令牌吗?如果是这样,在许多不同的微服务中存储 JWT 密钥是否安全?(我使用 dotenv 来存储密钥)
不,您需要了解非对称加密在这种情况下是如何工作的;但首先,请记住 JWT 可以使用许多不同类型的技术进行签名,而不仅仅是非对称加密签名。
为简单起见,请遵循以下流程图:
iss,IdP)和aud(受众,RP)声明正确对应于 IdP 和 RP。RS256或ES256)进行签名,则意味着 JWT 是使用 IdP 的(秘密)私钥进行签名的,并且可以使用RP 需要能够访问的IdP 的公钥来验证签名。
https://{authority}/.well-known/openid-configuration)。nbf(之前无效)和exp(过期)声明,以及任何其他最低限度必要的声明。
HS256)进行签名,则有两种方法可以继续:
| 归档时间: |
|
| 查看次数: |
3477 次 |
| 最近记录: |