Spring Security 和 OpenID Connect (OIDC)

Posted

技术标签:

【中文标题】Spring Security 和 OpenID Connect (OIDC)【英文标题】:Spring Security and OpenID Connect (OIDC) 【发布时间】:2016-06-28 08:48:12 【问题描述】:

在我当前的项目中,我全面使用 Spring Security OAuth (http://projects.spring.io/spring-security-oauth/) 项目来保护我们的资源 (Web API)。到目前为止一切正常。

我现在正在开发客户端,并且正在寻找对身份验证方案的良好支持(因为 OAuth 是一种授权协议)。经过长时间的互联网搜索,我很确定我应该使用 OpenID Connect (http://openid.net/connect/) 来满足这一要求,因为它是“OAuth 2.0 之上的简单身份层”(但我知道,没有“简单”在安全主题的情况下)。

很遗憾,但事实是,我在 Spring Security 中找不到任何关于 OpenID Connect 支持(不要与“纯”OpenID 混淆)的好资源。 https://github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server 有一个 OpenID Connect 参考实现,但我期望 Spring Security 中直接有类似的东西,包括全面的文档等等。我在这里找到了大约 2 年的讨论 https://github.com/spring-projects/spring-security-oauth/issues/220 但目前的状态是什么?寻找“OpenID Connect 的 Spring Security 支持”不会提供任何“有形”的结果。

您是否有任何关于在 Spring Security 的帮助下实施 OpenID Connect 的信息、文档和/或经验?

【问题讨论】:

【参考方案1】:

在OpenID Connect 出现之前,实际上可以假设请求参数response_type 的值是code(对于authorization code flow)或token(对于implicit flow)。但是,现在授权服务器实现必须能够处理(codetokenid_token)和none 的任意组合。详情在“OpenID Connect Core 1.0, 3. Authentication”和“OAuth 2.0 Multiple Response Type Encoding Practices”中描述。

作为支持 OpenID Connect 的第一步,Spring Security OAuth 必须对response_type 变得灵活。您可以在“Issue 619: Handling additional response_types”找到它的请求。但是,很难将只需要codetoken 的现有代码更改为一次可以接受多个值的新代码。在撰写本文时,Issue 619 于 2015 年 12 月 12 日发表的最新评论以如下一句话结尾。

任何 cmets 都非常受欢迎,因为这被证明是(正如我所预测的)大型重构练习

如果 Spring Security OAuth 纯粹是一个自愿的项目,没有任何商业机构的支持,那么不太可能发生如此大的变化。

我的经验:大约两年前,我从零开始编写了一个 OAuth 2.0 服务器。之后我才知道 OpenID Connect 的存在。在阅读了 OpenID Connect 相关的规范后,我终于得出了一个结论,即转储现有的实现,重新从头开始重写服务器。

如您所料,OpenID Connect 一点也不简单。

另见“5. 响应类型” “Full-Scratch Implementor of OAuth and OpenID Connect Talks About Findings”.


**更新**(2017 年 11 月 23 日)

Spring 框架上的授权服务器和 OpenID 提供程序https://github.com/authlete/spring-oauth-server

Spring 框架上的资源服务器https://github.com/authlete/spring-resource-server

spring-oauth-server 支持 OAuth 2.0 和 OpenID Connect。 spring-resource-server 具有在 “OpenID Connect 1.0, 5.3. UserInfo Endpoint”中定义的 UserInfo Endpoint 的实现。两种实现都不使用Spring Security OAuth,而是使用Spring Boot和Authlete。

博客:Spring + OAuth 2.0 + OpenID Connect

【讨论】:

以上是关于Spring Security 和 OpenID Connect (OIDC)的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 3.0.2 进行 OpenId 身份验证和自动注册

Spring security openId 支持和用户取消身份验证

Spring Security LDAP VS CAS VS OpenID 的区别

是否有像 *** 这样的 Spring Security OpenId 注册?

Spring security 3 在使用 OpenID 进行身份验证时忽略禁用/锁定标志

OpenID Connect 的 Spring Security 5 XML 配置