Spring security Spring安全性和Google OpenID连接迁移 问题:

Spring security Spring安全性和Google OpenID连接迁移 问题:,spring-security,google-oauth,google-openid,openid-connect,Spring Security,Google Oauth,Google Openid,Openid Connect,1) 将OpenID Connect身份验证集成到使用Spring安全性进行身份验证的webapp中的最佳方法是什么 2) 有没有什么方法可以让MITREid OpenID Connect身份验证过滤器与Google的OpenID Connect服务一起工作,无论是从事情的角度还是从Google帐户的角度 我相信这些问题的答案对于任何使用SpringSecurityOpenID模块向Google进行身份验证的开发人员都是有用的 详情: 我的webapp使用springsecurity的OpenI

1) 将OpenID Connect身份验证集成到使用Spring安全性进行身份验证的webapp中的最佳方法是什么

2) 有没有什么方法可以让MITREid OpenID Connect身份验证过滤器与Google的OpenID Connect服务一起工作,无论是从事情的角度还是从Google帐户的角度

我相信这些问题的答案对于任何使用SpringSecurityOpenID模块向Google进行身份验证的开发人员都是有用的

详情: 我的webapp使用springsecurity的OpenID模块(
)与作为身份提供者的Google帐户进行身份验证。例如,用户使用他们的谷歌应用程序或GMail电子邮件地址进行身份验证

最近,每当用户进行身份验证时,他们都会收到来自Google帐户的警告消息:

重要提示:针对谷歌账户的OpenID2将于4月份发布 2015年12月20日

因此,谷歌正在放弃对OpenID的支持,将在2015年4月完全关闭它,并声明如果你想通过谷歌帐户进行身份验证,你必须切换到OpenID连接协议

我希望Spring Security能够内置对OpenID Connect的支持,就像它内置对OpenID的支持一样。e、 类似于
元素的东西。但我的搜索结果没有得到这样的支持

到目前为止,我找到的最好的候选人是MITREid Connect。它包括一个用于OpenID Connect的名为
OIDCAuthenticationFilter
的Spring安全身份验证过滤器。问题是,它不能与Google的OpenID Connect实现进行互操作

我尝试克隆MITREid简单web应用程序,并将其配置为使用Google帐户进行身份验证(使用OpenID Connect)。但它不起作用,因为它依赖于Google的OpenID Connect实现不支持的nonce。来自Google帐户的错误消息是:

此消息类型不允许使用参数:nonce

接下来,我尝试将自己的MITREid的
AuthRequestUrlBuilder
接口实现插入MITREid配置中。我的实现和MITREid的实现之间的唯一区别是我没有发送nonce

不发送nonce使Google的OpenID Connect实现很高兴,但MITREid在Google身份验证响应中找不到nonce时抛出了一个异常。错误消息是:

身份验证失败:ID令牌不包含nonce声明

我在MITREid的
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的实现来忽略nonce。如此接近,却又如此遥远!如果Google帐户接受nonce,或者MITREid可以配置为忽略nonce,那么我们就有了一个解决方案

在github上的MITREid Connect问题列表中,我发现其他人也遇到了类似的问题:

1) #726-关于将客户端与谷歌一起用作身份验证提供商的文档

2) #704-在ServerConfiguration中添加useNonce属性,以指示IdP是否在其请求中接受nonce值

所以我被卡住了。2015年4月,谷歌将关闭开放式身份验证

一些相关链接:

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的功能,这让谷歌的OIDC服务器很高兴。幸运的是,mitreid connect也提供了一些帮助。
不幸的是,Maven central尚未提供“非可屏蔽”更改,但希望这很快就会改变。

AFAIK,没有从OpenID到OpenID Connect身份验证的干净、简单的Spring安全迁移。使用Spring Security实现OpenID身份验证是直接的,它使用的是文档丰富的
,但是OpenID Connect没有类似的功能

该项目仍在开发部门,无法在Maven Central获得,因此不是候选项目

在评论中,Chuck Mah指出了Romain F.提供的内容

罗曼的示例代码为我指明了正确的方向。考虑到时间不多,我采用了romain的方法,即编写一个定制的Spring Security AuthenticationFilter,它使用Spring-Security-oauth2来查询oauth2 api(对于Google来说就是这样)。假设我们能够成功地查询userinfo端点,那么用户已经成功地进行了身份验证,因此我们可以信任返回的信息-例如用户的电子邮件地址

当我第一次开始学习OpenID连接时,“”似乎是中心概念。但是,在浏览spring-security-oauth2源代码时,它似乎被忽略了。这就引出了一个问题,如果我们可以在没有ID令牌的情况下进行身份验证(只需查询oauth2 userinfo端点),那么ID令牌的意义何在

一个最简单的解决方案——我更喜欢——只需返回一个经过验证的ID令牌。不需要查询userinfo端 <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <filter> <filter-name>oauth2ClientContextFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>oauth2ClientContextFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>