15

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

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

4

3 回答 3

11

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

PKCE 标准 ( https://www.rfc-editor.org/rfc/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 节中指出,这种认可很可能会成为一个已发布的标准。

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

于 2020-08-06T01:16:46.457 回答
1

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

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

于 2020-04-07T20:47:26.133 回答
1

恕我直言,一个很好的替代方案是使用 Keycloak 作为 IDP,然后将 Google 添加到您的 Keycloak 实例的委托身份提供者(然后是 Facebook,如果需要,然后是任何其他 idp)。Keycloak 以可靠的方式实现 PKCE 流或 Oauth 2 RFC 中的任何流。这意味着您需要一个托管的 Keycloak 实例。

于 2021-09-18T21:52:20.553 回答