将 Google OIDC 与代码流和 PKCE 结合使用

Mar*_*lli 11 oauth-2.0 single-page-application openid-connect google-identity pkce

经过反复试验,在我看来,Google OIDC 在不提供客户端机密的情况下不支持代码流:https : //developers.google.com/identity/protocols/oauth2/native-app#exchange-authorization-code

根据 SPA 的最新最佳实践 ( https://tools.ietf.org/html/draft-ietf-oauth-security-topics-13 ),代码流 + PKCE 是处理身份验证的推荐方式。有没有人知道让 Google 的代码流接受 code_challenge 而不是 client_secret 所需的任何技巧?也许是一个虚假的秘密?

Ric*_*ods 8

截至 2020 年 8 月,所引用的最佳实践文档仍处于草稿状态并正在积极更新 - 此处为主要修订:https ://datatracker.ietf.org/doc/draft-ietf-oauth-security-topics/ 。Googles 的 OAuth2 实现尚未应用 PKCE 应用于 Web 应用程序的“正在进行的工作”建议。SPA 仍然被指示使用 Google 在线文档中的隐式流:https : //developers.google.com/identity/protocols/oauth2/javascript-implicit-flow)。

PKCE 标准 ( https://tools.ietf.org/html/rfc7636 ) 详细说明,它是为了缓解移动平台上发现的授权代码拦截攻击而开发的,最初建议由本机客户端实施。Google 的“移动和桌面应用程序”文档确实指导开发人员使用 PKCE 授权代码流。使用带有 PKCE 的 Google Android、iOS 或 Windows 存储凭证类型的客户端可能会省略client_secret(请参阅刷新令牌参数表上的注释 - 并由 Cristiano 确认)。

现在认识到 PKCE 消除了任何公共客户端存储客户端机密的需要,因此可用于弃用隐式流,该流总是存在在重定向 URI 中包含返回的访问和身份令牌的缺陷。https://developer.okta.com/blog/2019/05/01/is-the-oauth-implicit-flow-dead

IETF 文件草案在第 2.1.1 节中指出,这种认可可能会成为已发布的标准。

client_secret当最佳实践被接受时,希望谷歌将更新其实现以删除对PKCE 令牌请求的要求。与此同时,我们似乎别无选择,只能继续使用隐式流程编写 SPA。

  • 可笑,我简直不敢相信你最后一段话。但这是真的吗?https://developers.google.com/identity/protocols/oauth2/native-app#step1-code-verifier 说“Google 支持 [PKCE] 以使安装的应用程序流程更加安全”。但如果没有客户端密钥,我无法使用 PKCE 进行 Google OIDC。Google 强迫我在客户端上保留一个秘密,并且该秘密始终可能被盗,请参阅:https://developer.okta.com/blog/2019/01/22/oauth-api-keys-arent-safe-in-mobile -apps#https-requests-can-be-intercepted-from-mobile-apps。完全消除 PKCE 提供的任何安全优势吗?请告诉我我错了。 (5认同)
  • @Heinzlmaen 是的,这就是 PKCE 的要点……“客户端秘密”不被认为是秘密。无论谷歌是否强迫你提供,它最终都不是可信的。虽然它至少可能迫使攻击者付出更多的努力……也就是说,如果客户端秘密实际上是错误的,那么尽快发送 4xx 状态代码比遍历整个谜题消耗更少的资源,直到发现PKCE也是错误的。因此,请将其视为快速失败的反滥用要求。 (2认同)
  • @Ash 对于*安装的应用程序*,您可能会“分发应用程序二进制文件”(例如通过应用程序商店),现在拥有您的二进制文件的任何一方都在其反汇编程序中拥有您的应用程序的“client_secret”和“client_id”。对于*网站* ...客户端秘密保留在服务器场上,没有问题。但是,在没有 PCKE 的情况下执行“授权代码”流程的已安装应用程序可能会面临同一设备上的恶意应用程序拦截“重定向”的风险,然后使用您的应用程序的客户端 ID/客户端秘密来交换访问令牌的代码。对于 PCKE,它还必须在获取令牌之前证明它是发起 OAuth 请求的人。 (2认同)

Cri*_*ano 2

好吧,我在使用此库的 Android 应用程序中使用 openId Connect 授权代码与 pkce ,而不使用 client_secret :https://github.com/openid/AppAuth-Android

我只需确保使用清单中应用程序的包名称设置自定义方案,并使用它在 google 控制台上注册 android 凭据。