我们正在开发一个Sping Boot 应用程序,它是一个OIDC客户端。身份提供者(IdP)是一个第三方服务,完全兼容OpenID Connect和OAuth 2.0(就我们所知)。由于它是以高安全性为目标构建的,它的 UserInfo 端点返回一个 * 已签名 * 的JWT(而不是常规的JWT)。
Spring Security似乎不支持它。身份验证流以一条错误消息结束(显示在Spring应用程序生成的HTML页面中):
[invalid_user_info_response]尝试检索用户信息资源时出错:无法提取响应:未找到适合响应类型[java.util.Map]和内容类型[application/jwt;字符集=UTF-8]
我的疑问:
- Spring目前不支持返回已签名JWT的 UserInfo 端点,这对吗?
- 如果是,我们如何添加对已签名JWT的支持(包括签名验证)?
我们的分析显示DefaultOAuth2UserService
请求(Accept: application/json
)并期望IdP的JSON响应。但是,由于IdP配置为高安全性,因此它返回一个内容类型为application/jwt
的签名JWT。该响应类似于jwt.io上的示例。由于RestTemplate
没有能够处理内容类型application/jwt
的消息转换器,因此验证失败。
我们的示例应用程序非常简单:
构建.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '2.2.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
}
演示应用程序.java
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
应用程序.yml
server:
port: 8081
spring:
security:
oauth2:
client:
registration:
demo:
client-id: our-client-id
client-secret: our-client-secret
clientAuthenticationMethod: post
provider: our-idp
scope:
- profile
- email
provider:
our-idp:
issuer-uri: https://login.idp.com:443/idp/oauth2
家庭控制器.java
package demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
@GetMapping("/")
String hello() { return "hello"; }
}
2条答案
按热度按时间hkmswyz61#
经过更多的分析,似乎Sping Boot 不支持 UserInfo 端点返回签名的JWT。这显然是一个不寻常的设置(但仍然在OAuth 2.0 / OIDC规范范围内)。到目前为止我还没有提到的是,JWT是用 client secret 签名的。
当Sping Boot 不支持它时,可以添加它。解决方案包括:
DefaultOAuth2UserService
的替代)HttpMessageConverter
(用于用户服务的RestTemplate
)JwtDecoder
请注意,我们同时已从OAuth 2.0更改为OIDC,因此我们的
application.yml
现在包括openid
范围。安全配置为:
如果使用OAuth 2.0而不是OIDC(即不使用作用域“openid”),配置会更简单:
ValidatingOAuth2UserService
类在很大程度上是DefaultOAuth2UserService
的副本:最后是
JwtHttpMessageConverter
类:ws51t4hk2#
谢谢@Codo。你救了我一天。虽然我没有使用JwtHttpMessageConverter类。我在SecurityConfig类中添加了以下内容。在我的情况下,我必须使用JwksUri和SignatureAlgorithm.RS512。
公司名称:OAuth2 UserService发布时间:2009 - 4 - 11