【发布时间】:2015-02-09 02:17:43
【问题描述】:
问题:
1) 将 OpenID Connect 身份验证集成到使用 Spring Security 进行身份验证的 web 应用程序中的最佳方法是什么?
2) 是否有任何方法(无论是从 MITREid 方面还是从 Google 帐户方面)让 MITREid OpenID Connect 身份验证过滤器与 Google 的 OpenID Connect 服务一起使用?
我相信这些问题的答案对于任何使用 Spring Security OpenID 模块向 Google 进行身份验证的开发人员都会很有用。
详情:
我的 webapp 使用 Spring Security 的 OpenID 模块 (<openid-login .../>) 使用 Google 帐户作为身份提供者进行身份验证。即,用户使用他们的 Google Apps 或 GMail 电子邮件地址进行身份验证。
最近,每当用户进行身份验证时,他们都会从 Google 帐户收到以下警告消息:
重要通知:Google 帐户的 OpenID2 将于 4 月停用 2015 年 2 月 20 日。
因此,Google 将放弃对 OpenID 的支持,并将在 2015 年 4 月将其完全关闭,并声明如果您想使用 Google 帐户进行身份验证,则必须切换到 OpenID Connect 协议。
我希望 Spring Security 能够内置对 OpenID Connect 的支持,就像它内置对 OpenID 的支持一样。例如类似于<openid-connect-login .../> 元素。但是我的搜索没有出现这样的支持。
到目前为止,我发现的最佳候选者是 MITREid Connect 。它包括一个名为 OIDCAuthenticationFilter 的 Spring Security 身份验证过滤器,用于 OpenID Connect。问题是,它不能与 Google 的 OpenID Connect 实现互操作。
我尝试克隆 MITREid simple-web-app 并将其配置为使用 Google 帐户进行身份验证(使用 OpenID Connect)。但它不起作用,因为它依赖于 Google 的 OpenID Connect 实现不支持的 nonce。来自 Google 帐户的错误消息是:
此消息类型不允许使用参数:nonce
接下来我尝试将我自己实现的 MITREid 的AuthRequestUrlBuilder 接口插入到 MITREid 配置中。我的实现和 MITREid 的实现之间的唯一区别是我没有没有发送随机数。
不发送 nonce 让 Google 的 OpenID Connect 实现很满意,但 MITREid 在 Google 身份验证响应中找不到 nonce 时抛出了异常。错误信息是:
身份验证失败:ID 令牌不包含 nonce 声明
我在 MITREID'S OIDCAuthenticationFilter 中将 MITREid 异常跟踪到这些行:
// compare the nonce to our stored claim
String nonce = idClaims.getStringClaim("nonce");
if (Strings.isNullOrEmpty(nonce)) {
logger.error("ID token did not contain a nonce claim.");
throw new AuthenticationServiceException("ID token did not contain a nonce claim.");
}
但我无法扩展 MITREid 的实现以忽略随机数。如此接近,却又如此遥远!如果 Google 帐户接受 nonce 或 MITREid 可以配置为忽略 nonce,那么我们就有了解决方案。
在 github 上的 MITREid Connect 问题列表中,我发现其他人也遇到了这些类似的问题:
1) #726 - 使用 Google 客户端作为身份验证提供程序的文档
2) #704 - 在 ServerConfiguration 中添加一个 useNonce 属性,以指示 IdP 是否在其请求中接受 nonce 值。
所以我被困住了。 2015 年 4 月,Google 将关闭 Open ID 身份验证。
一些相关链接:
1) https://support.google.com/accounts/answer/6135882
2)https://www.tbray.org/ongoing/When/201x/2014/03/01/OpenID-Connect
3)https://github.com/mitreid-connect
4) https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/blob/master/openid-connect-client/src/main/java/org/mitre/openid/connect/client/OIDCAuthenticationFilter.java
5)https://github.com/mitreid-connect/simple-web-app
6)https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/blob/master/openid-connect-client/src/main/java/org/mitre/openid/connect/client/service/impl/PlainAuthRequestUrlBuilder.java
7) https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/issues/726
8) https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server/pull/704
2015-02-18 更新
最近在 mitreid-connect 的开发分支中添加了用于禁用 nonce 的功能,从而使 Google 的 OIDC 服务器满意。值得庆幸的是,mitreid-connect 也提供了一些 guidance on interoperating with Google 。 不幸的是,“nonceEnabled”更改在 Maven 中心尚不可用,但希望很快就会改变。
【问题讨论】:
-
写。 to 2):“nonce”问题确实是 Google 的 OpenID Connect 实现的一个问题,因为它不符合规范;您应该能够切换到实际有效的流程,例如隐式流
-
卡住的不止你一个。似乎 Spring Security 的人并不真正关心。你有什么进展吗?
-
Hans Z.:感谢您确认 nonce 问题是与 Google OIDC 的已知互操作性问题。我不熟悉 OAuth 2 流程的工作原理,但可能不得不考虑深入挖掘。我用“google-oauth”和“google-openid”标记了这个问题,希望谷歌的人可以提供指导。
-
Kees:我用“Spring Security”标记了这个问题,希望 Spring Security 团队的人能提供一些指导。我认为 Stack Overflow 取代了旧的 Spring Security 论坛,并且 Spring Security 团队监控了相关的 Stack Overflow 问题。
-
您可以使用 Spring-social-google 将 spring security 与 google open connectid 集成。它在引擎盖下使用 oauth 2.0。另请查看stackoverflow.com/questions/11849148/… 了解更多选项
标签: spring-security google-oauth google-openid openid-connect