在 Spring Security 5 OAuth Client 和 Spring Boot 2.0 中,authorizationGrantType 不能为空

Posted

技术标签:

【中文标题】在 Spring Security 5 OAuth Client 和 Spring Boot 2.0 中,authorizationGrantType 不能为空【英文标题】:authorizationGrantType cannot be null in Spring Security 5 OAuth Client and Spring Boot 2.0 【发布时间】: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 就够了。

【问题讨论】:

【参考方案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(已弃用)。

以上是关于在 Spring Security 5 OAuth Client 和 Spring Boot 2.0 中,authorizationGrantType 不能为空的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Security 5 OAuth Client 和 Spring Boot 2.0 中,authorizationGrantType 不能为空

使用 Spring Security 5 OAuth2 实现 Keyclock 授权服务器

Spring Security 5 OAuth 2 社交注销

配置 Spring Security 5 Oauth 2 以使用 access_token uri 参数

Spring Security 5 OAuth 2.0 ResourceServer 如何与 AuthorizationServer 通信?

Spring Security 5 中使用 oauth2 的自定义登录页面返回 null