在 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-config
、spring-security-oauth2-client
、spring-security-oauth2-jsoe
等。
更新:
我找到原因了,对于自定义的OAuth2提供者,例如Gitlab,我必须添加grant type, redirectUritemplate、scope、clientName等,但是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 通信?