我尝试使用 Spring Boot 3.4.1 运行 oAuth 的所有 3 个 oAuth 组件。我使用oauth-server-docs和客户端 + 资源服务器文档来实现。
oAuth 客户端可以有两种模式:
- 使用 OAuth 2.0 或 OpenID Connect 1.0 登录用户,以及
- 获取用户访问令牌(使用 RestClient/WebClient)。
我想同时使用两者,根据文档,这是可能的。
我的代码 - 所有组件 - 都在 GitHub 上:https://github.com/OhadR/oAuth2-sample
除了一件事之外,一切似乎都运行正常:当客户端应用程序在用户登录之前尝试调用资源服务器时,资源服务器返回 401(我认为这是可以的),但是客户端应用程序不会重定向到 oauth 服务器,而是只返回 500。
我曾尝试调试 Spring,但没有成功。
我看到在中OAuth2AuthorizationRequestRedirectFilter.doFilterInternal()
,当其余过滤器链抛出异常时,Spring 会检查是否存在异常ClientAuthorizationRequiredException
,如果是,则检查是否存在sendRedirectForAuthorization()
。但在我的例子中,由于某种原因,这段代码从未运行过(我在那里设置了一个断点,但它从未在那里停止)。
另外,我发现AuthorizationCodeOAuth2AuthorizedClientProvider.authorize()
应该抛出 的ClientAuthorizationRequiredException
并没有被调用。(它只在“登录”流程中被调用,即在用户登录后,客户端应用调用资源服务器时)。
什么起作用?上面的模式 (1),意味着客户端应用程序有一个“登录”按钮,它调用 /login/oauth2/code/{registrationId}。这会重定向到 oauth 服务器,用户登录,然后当客户端应用程序尝试调用资源服务器时,它会正常工作,并得到 200 响应。
但模式 (2) 不起作用。我遗漏了什么?
谢谢!