有没有办法从ClientRegistration对象中查找OAuth2提供者ID?

时间:2019-04-23 22:33:06

标签: spring spring-boot spring-security oauth-2.0 spring-security-oauth2

我正在开发一个使用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不公开此信息。

我曾希望ClientRegistrationhttps://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

1 个答案:

答案 0 :(得分:0)

不幸的是,如果您查看一下Spring Boot的自动配置,您会发现此信息没有以任何方式保存。

说明

看看OAuth2ClientPropertiesRegistrationAdapter,了解创建ClientRegistration背后的逻辑。

  1. 每次注册的提供者String被捕获在OAuth2ClientProperties.Registration对象的字段中,该对象已使用您的配置填充。
  2. 您在spring.security.oauth2.provider中提供的提供者信息用于创建OAuth2ClientProperties.Provider。但是,“ providerId”不会保存在对象本身中(无论如何它都没有“ providerId”或“ providerName”字段)。相反,提供者名称/标识是Map<String,Provider>中存在的OAuth2ClientProperties的密钥。
  3. 构建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” ...