OpenID Connect id_token 和 access_token 被web服务器获取是否需要验证?

Do OpenID Connect id_token and access_token need to be validated if they are obtained by web server?

我想知道在OpenID Connect Auth Code Flow中,是否还需要验证access_tokenid_token 假设它们是由我的网络服务器而不是浏览器获取的(即使用后通道而不是前通道)?

“授权代码流”指的是浏览器仅从授权服务器接收“授权代码”(即无 access_token、无 id_token)并发送我的网络服务器的授权代码。因此,我的 Web 服务器可以直接与授权服务器对话,提供授权代码,并将其交换为 access_token 和 id_token。看起来我可以简单地解码 access_token 和 id_token 来获取我想要的信息(主要是用户 ID 等)

我对需要验证access_token的理解是因为access_token没有加密,如果通过不安全的渠道传输,我的网络服务器有可能获得伪造的令牌。验证token基本上就是验证token没有被修改过。

但是如果 access_token 没有在任何不安全的通道上传输怎么办?在授权代码流程中,Web 服务器直接从授权服务器检索 access_token,令牌永远不会发送到浏览器。我还需要验证令牌吗?如果我在这样的流程中跳过验证,会有哪些潜在风险?

您应该始终验证令牌并应用众所周知的令牌验证模式。因为否则你会为各种漏洞打开你的架构。例如,如果黑客拦截您与令牌服务的“私人”通信,您就会遇到 man-in-the-middle 问题。

而且大多数图书馆都会自动为您进行验证,因此验证不是问题。

当您开发身份系统时,您应该遵循最佳实践和各种当前最佳实践,因为这是系统用户对您的期望。

作为客户端,您使用 HTTPS 从 IdentityServer 获取 public 密钥,因此您知道从正确的服务器获取的是什么。要添加额外的安全层,您还可以使用客户端 HTTPS 证书,以便 IdentityServer 仅向使用证书进行身份验证的客户端颁发令牌。

这样一来,man-in-the-middle就很不可能了。但是,在后端的 data-centers 中,您有时不会在内部到处使用 HTTPS。 TLS 通常在代理中终止,您可以阅读更多相关信息 here

当您收到 ID-token 时,您通常会从中创建用户会话。是的,由于令牌是通过更安全的反向通道发送的,因此您可以非常安全。但是今天仍然有很多攻击发生在内部,为了根据所有最佳实践做好工作,您应该验证它们,包括签名和令牌内的声明(过期、发行者、观众......)。

对于访问令牌,重要的是接收它的 API 根据所有最佳实践对其进行验证,因为任何人都可以向它发送带有令牌的请求。

此外,学习很有趣:-)

ps,这个video是一个很好的起点