我有以下设置:
- 我有一个Angular前端和Spring-Boot后端
- 用户正在通过普通表单登录到我的后端
- 我正在集成需要oauth2身份验证的第三方API,因此用户需要向我的应用程序授予权限,以便我可以代表他们从该第三方加载数据
- 我在
HttpSecurity
配置中配置了oauth2Client()
以启用oauth2
目前发生的情况是:
1.前端正在调用一个端点以从第三方获取数据,比如/api/get-library
,它试图访问第三方的受保护资源。
1.这将导致来自第三方的401
,并触发Spring中的oauth流
1.用户被重定向到第三方以授予对我的应用程序的权限
1.授予权限后,用户首先被重定向到指定为spring.security.oauth2.client.registration.foobar.redirect-uri
的URL I
1.然后, Boot 检索令牌并为我的主体存储它
1.之后,Sping Boot将重定向到原始url/api/get-library
1.但这只是一些RestController
,因此在浏览器中向用户显示一些JSON数据
所以第六点是我的问题。我不希望用户最终被重定向到某个API端点,我希望他被重定向到我的Angular应用程序的一个页面。
如果用户拒绝授予权限,也会出现类似的问题。然后,用户被重定向到spring.security.oauth2.client.registration.foobar.redirect-uri
,查询参数为?error=true
。同样,在这种情况下,我希望重定向到我的Angular应用程序。
最初,我想我也可以配置oauth2Login()
,它有一个failureHandler
和successHandler
,但在我的例子中没有调用它们,因为我在这里没有进行登录。
那么有人能帮助我吗?我如何为oauth2Client
配置我自己的重定向?在成功的情况下,以及失败的情况下?这里有哪些相关的Bean?
1条答案
按热度按时间lawou6xi1#
我找到了解决办法:
要检查的主要Spring类是
OAuth2AuthorizationCodeGrantFilter
。当用户在OAuth提供程序中授予/拒绝权限时,将调用此筛选器。不幸的是,没有办法为此过滤器配置自定义重定向URL,所以我实现了一个黑客解决方案:
1.我将
OAuth2AuthorizationCodeGrantFilter
的实现复制到一个自己的类中,并使用2个参数对其进行了扩展:然后我在processAuthorizationResponse
方法中使用这些URL来重定向到我的URL1.然后,我将自己的
AppOAuth2AuthorizationCodeGrantFilter
放在HttpSecurityConfig
中的Spring Filter之前,因此使用它来代替Spring版本1.在我的Angular应用程序中,我在调用可能需要OAuth身份验证的端点之前,将确切位置存储在应用程序中。因此,当用户代理返回到Angular应用程序时,我可以导航回原始位置。
这感觉很糟糕,所以如果有人能想出更好的解决方案,我会很高兴听到。:-)
Spring的一些代码片段: