我正在开发一个使用Spring Security 5.x的OAuth2支持进行登录的应用程序。我的一个用例之一是需要为同一OAuth2身份提供者进行多个客户端注册,然后在运行时在给定与范围内OAuth2客户端相对应的import auth0 from 'auth0-js';
对象的情况下查找提供者ID。是否有提供此信息的公共API?
ClientRegistration
API:https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/api/org/springframework/security/oauth2/client/registration/ClientRegistration.html不公开此信息。
我曾希望ClientRegistration
:https://docs.spring.io/spring-security/site/docs/5.1.5.RELEASE/api/org/springframework/security/oauth2/client/registration/ClientRegistration.ProviderDetails.html会包含它,但是在那里没有运气。
我正在使用具有YAML配置的Spring Boot2.x。客户端注册数据中的ProviderDetails
键的值完全是 我在运行时需要访问的值:
provider
这似乎是一个奇怪的疏忽(很明显,Spring Security内部可以使用它),所以我被遗忘了,想知道我是否缺少明显的东西。
我认为我可以写这样的东西:
spring:
security:
oauth2:
provider:
myprovider:
authorization-uri: "https://oauth2.example.com/authorize"
jwk-set-uri: "https://oauth2.example.com/jwks.json"
token-uri: "https://oauth2.example.com/tokens"
registration:
client1:
provider: "myprovider"
client-id: "id-1"
client-secret: "secret-1"
authorization-grant-type: "authorization_code"
client2:
provider: "myprovider"
client-id: "id-2"
client-secret: "secret-2"
authorization-grant-type: "authorization_code"
但是我找不到与以上ClientRegistration registration = someObject.getClientRegistration();
String providerId = registration.getProviderId();
等效的东西,甚至找不到与#getProviderId()
bean类似的ProviderRepository
。
答案 0 :(得分:0)
不幸的是,如果您查看一下Spring Boot的自动配置,您会发现此信息没有以任何方式保存。
看看OAuth2ClientPropertiesRegistrationAdapter
,了解创建ClientRegistration
背后的逻辑。
String
被捕获在OAuth2ClientProperties.Registration
对象的字段中,该对象已使用您的配置填充。spring.security.oauth2.provider
中提供的提供者信息用于创建OAuth2ClientProperties.Provider
。但是,“ providerId”不会保存在对象本身中(无论如何它都没有“ providerId”或“ providerName”字段)。相反,提供者名称/标识是Map<String,Provider>
中存在的OAuth2ClientProperties
的密钥。ClientRegistration
时,String
中的提供者OAuth2ClientProperties.Registration
用于搜索地图。找到提供程序后,将使用它来配置ClientRegistration.Builder
。这是从OAuth2ClientProperties.Provider
获得的所有信息:
private static Builder getBuilder(Builder builder, Provider provider) {
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
map.from(provider::getAuthorizationUri).to(builder::authorizationUri);
map.from(provider::getTokenUri).to(builder::tokenUri);
map.from(provider::getUserInfoUri).to(builder::userInfoUri);
map.from(provider::getUserInfoAuthenticationMethod)
.as(AuthenticationMethod::new)
.to(builder::userInfoAuthenticationMethod);
map.from(provider::getJwkSetUri).to(builder::jwkSetUri);
map.from(provider::getUserNameAttribute)
.to(builder::userNameAttributeName);
return builder;
}
因此,OAuth2ClientProperties.Registration
中的“ providerId”永远不会到达ClientRegistration
,而OAuth2ClientProperties.Provider
中的“ providerId”永远不会到达Provider
。
最后得到的是ClientRegistration
,其中有ProviderDetails
...,但没有“ providerId” ...