Spring 带有自定义提供程序的启动 + 安全 OAuth2.0 客户端

Spring Boot + Security OAuth2.0 Client with Custom Provider

我正在 Spring Boot + Security(版本 5)应用程序中为自定义 OAuth2 提供程序创建 OAuth2.0 客户端。

下面是application.properties,在我的项目中有所有的配置,没有额外的配置class。

spring.security.oauth2.client.registration.xxxxxxxxx.client-id=XXXXXXXXXX
spring.security.oauth2.client.registration.xxxxxxxxx.client-secret=XXXXXXXXXX
spring.security.oauth2.client.registration.xxxxxxxxx.scope=openid
spring.security.oauth2.client.registration.xxxxxxxxx.redirect-uri-template=http://localhost:8080/login/oauth2/code/xxxxxxxxx
spring.security.oauth2.client.registration.xxxxxxxxx.client-name=xxxxxxxxx
spring.security.oauth2.client.registration.xxxxxxxxx.provider=xxxxxxxxx
spring.security.oauth2.client.registration.xxxxxxxxx.client-authentication-method=basic
spring.security.oauth2.client.registration.xxxxxxxxx.authorization-grant-type=authorization_code

spring.security.oauth2.client.provider.xxxxxxxxx.authorization-uri=https://api.xxxxxxxxx.com/authorize
spring.security.oauth2.client.provider.xxxxxxxxx.token-uri=https://api.xxxxxxxxx.com/token
spring.security.oauth2.client.provider.xxxxxxxxx.user-info-uri=https://api.xxxxxxxxx.com/userinfo?schema=openid
spring.security.oauth2.client.provider.xxxxxxxxx.user-name-attribute=name
spring.security.oauth2.client.provider.xxxxxxxxx.user-info-authentication-method=header

当我点击 http://localhost:8080/ 时,它会正确重定向到提供商的登录页面,成功登录后,它会重定向回我的应用程序。

现在的问题是当它重定向时,它会显示下面的错误消息。

我用谷歌搜索了这个错误,但没有得到任何正确的答案。此外,OAuth2 提供者没有共享 URL.

经过研究我才知道我需要在下面设置属性。它应该由 Auth Provider 提供吗? spring.security.oauth2.client.provider.pepstores.jwk-set-uri

我在配置中到底缺少什么?

当您在客户端应用程序中收到JWT 时,您需要验证JWT 的签名。要验证签名,您需要 Auth 提供商的 public 密钥。根据 OAuth 规范,Auth 提供者可以通过 URI 公开 public 密钥,客户端可以使用此 URI 获取 public 密钥来验证 JWT。这是您的配置中缺少的内容。

终于,问题解决了。我只需要配置应该由 Auth 提供商提供的 jwk URI。 下面是客户 Auth Provider 的最终配置。

spring.security.oauth2.client.registration.xxxxxxxxx.client-id=XXXXXXXXXX
spring.security.oauth2.client.registration.xxxxxxxxx.client-secret=XXXXXXXXXX
spring.security.oauth2.client.registration.xxxxxxxxx.scope=openid
spring.security.oauth2.client.registration.xxxxxxxxx.redirect-uri-template=http://localhost:8080/login/oauth2/code/xxxxxxxxx
spring.security.oauth2.client.registration.xxxxxxxxx.client-name=xxxxxxxxx
spring.security.oauth2.client.registration.xxxxxxxxx.provider=xxxxxxxxx
spring.security.oauth2.client.registration.xxxxxxxxx.client-authentication-method=basic
spring.security.oauth2.client.registration.xxxxxxxxx.authorization-grant-type=authorization_code

spring.security.oauth2.client.provider.xxxxxxxxx.authorization-uri=https://api.xxxxxxxxx.com/authorize
spring.security.oauth2.client.provider.xxxxxxxxx.token-uri=https://api.xxxxxxxxx.com/token
spring.security.oauth2.client.provider.xxxxxxxxx.user-info-uri=https://api.xxxxxxxxx.com/userinfo?schema=openid
spring.security.oauth2.client.provider.xxxxxxxxx.user-name-attribute=name
spring.security.oauth2.client.provider.xxxxxxxxx.user-info-authentication-method=header
spring.security.oauth2.client.provider.xxxxxxxxx.jwk-set-uri=https://api.xxxxxxxxx.com/jwks

谢谢