【问题标题】:authorizationGrantType cannot be null in Spring Security 5 OAuth Client and Spring Boot 2.0在 Spring Security 5 OAuth Client 和 Spring Boot 2.0 中,authorizationGrantType 不能为空
【发布时间】:2018-08-25 05:08:43
【问题描述】:

我按照 Spring Security 5.0 官方参考文档和示例代码 oauth2login 在我的项目中设置 OAuth2/OIDC 身份验证,但是失败了,当我通过 mvn spring-boot:run 启动我的应用程序时出现以下异常。

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'clientRegistrationRepository' 
    defined in class path resource [org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2ClientRegistrationRepositoryConfiguration.class]: 
    Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: 
    Failed to instantiate [org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository]: 
    Factory method 'clientRegistrationRepository' threw exception; 
    nested exception is java.lang.IllegalArgumentException: authorizationGrantType cannot be null

我使用的是Spring Boot提供的默认配置,只是在项目中添加了一些基本的依赖,例如spring-security-configspring-security-oauth2-clientspring-security-oauth2-jsoe等。

更新:

我找到原因了,对于自定义的OAuth2提供者,例如Gitlab,我必须添加grant type redirectUritemplatescopeclientName等,但是OpenID Connect规范有一个配置端点协议,例如:https://gitlab.com/.well-known/openid-configuration,有没有可能让Spring Security读取这个自动获取信息?

更新(5/15/2021):在最新的 Spring Security 5.4 和 Spring Boot 2.4 中,默认发现 OpenId 配置 (.well-known/openid-configuration),对于大多数 oauth2/oidc 授权服务器,配置一个 issuer_uri 就够了。

【问题讨论】:

    标签: spring spring-boot spring-security oauth-2.0 openid-connect


    【解决方案1】:

    详细说明Arpeet's answer,您需要包含在application.yaml 中以解决原始错误的属性如下所示,在这种情况下适用于 Azure AD(请注意,这仅适用于 Spring Security 5,不适用于 Spring Security功能为being merged的OAuth2 2.x直接进入Spring Security 5):

    spring:
      security:
        oauth2:
          client:
            registration:
              microsoft:
                client-id: a935ba7b-6aa4-4b0c-9e84-04f9acaa477b
                client-secret: redacted
                authorization-grant-type: authorization_code
                redirect-uri-template: '{baseUrl}/login/oauth2/code/{registrationId}'
                scope: User.Read
                client-name: Microsoft
                client-alias: microsoft
            provider:
              microsoft:
                authorization-uri: https://login.microsoftonline.com/common/oauth2/authorize?resource=https://graph.microsoft.com/
                token-uri: https://login.microsoftonline.com/common/oauth2/token
                user-info-uri: https://graph.microsoft.com/v1.0/me
                user-name-attribute: sub
                jwk-set-uri: https://login.microsoftonline.com/common/discovery/keys
    

    【讨论】:

    • 我明白这一点,但我读过文档,它说某些属性应该有默认值,例如redirect-uri-template,但它不适用于 cusotm 配置。
    • 我有同样的经历,但我在这里发帖是为了让其他人确切知道哪些属性需要完整填写
    • 在某些情况下,您似乎可以使用 issuer-uri 而不是 authorization-uri、token-uri、jwk-set-uri 和 user-info-uri。我创建了一个自定义 okta 提供程序/注册(但将其命名为 test 以便 spring 不会为我自动检测到一堆废话),并且 issuer-uri 实际上自己为我工作。 Jwk-set-uri 有时需要独立于 issuer-uri 进行设置,尽管我还没有完全理解何时和为什么的那部分内容。 docs.spring.io/spring-security/site/docs/current/reference/…
    【解决方案2】:

    redirect-uri-template -> 重定向-uri 它适用于 SpringBoot 2.2.0.RELEASE

    但它可以在 spring 2.1.x 中使用 redirect-uri-template

    【讨论】:

      【解决方案3】:

      如果使用 SpringBoot v2.2.1 RELEASE,则使用 redirect-uri 而不是 redirect-uri-template

      【讨论】:

      • 同样适用于版本 Spring boot 版本 2.2.6.RELEASE。谢谢!
      • 同样适用于 2.3.2
      【解决方案4】:
          <dependency>
              <groupId>org.springframework.security.oauth.boot</groupId>
              <artifactId>spring-security-oauth2-autoconfigure</artifactId>
              <version>2.4.5</version>
          </dependency>
      

      在你的 pom 中添加这个依赖并检查

      【讨论】:

      • 这适用于旧版 Spring Secuirty 4.x 和 Spring Security Oauh(已弃用)。
      猜你喜欢
      • 2019-02-18
      • 2019-03-07
      • 2019-05-24
      • 1970-01-01
      • 2018-10-07
      • 2019-02-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      相关资源
      最近更新 更多