在开发单页应用程序时,今天的许多服务仍然推荐 OpenID Connect/Oauth2 令牌交换的隐式流程。(见Okta - 现在推荐 PKCE w/implicit fallback, Google , Auth0)
一些较新的指导指向在令牌交换步骤中使用没有 client_secret 的授权代码流,我同意这是有道理的,因为文章中引用了原因(例如,令牌不在浏览器历史记录、网络日志等中。 )。为什么这个概念没有在 PKCE 中更进一步?与其完全省略 client_secret,不如像本机应用程序推荐的那样使用动态的?SPA 和 Native Apps 都被认为是“公共客户端”,无法安全地保存秘密,但只有 Native Apps 获得 PKCE 推荐,而 SPA 似乎被保留在过去。
我了解 PKCE 试图解决的安全隐患与仅浏览器的上下文没有直接关系,但这难道不能被视为一种纵深防御机制并无论如何都可以使用吗?我从经验中知道,Google 不会让您生成 Web 应用程序凭据并尝试对 SPA 使用除隐式以外的任何内容(请参阅此问题),授权代码流程将需要 client_secret 并且 PKCE 交换仅在您选择本机时才有效应用程序凭据类型,但您不能为您的应用程序指定 https redirect_uri。
其他提供商允许 PKCE 在 Web 上下文中使用授权代码流,但他们不建议这样做。我想要这个并利用它有错吗?使用可用的Web Crypto API(针对较新的浏览器并根据需要进行填充)添加额外的步骤来生成和传递代码挑战似乎相当简单。