bounty还有2天到期。回答此问题可获得+50声望奖励。Sercan Ozdemir希望引起更多关注这个问题。
我知道Cognito本身通常是Oauth2流中的一个授权服务器角色。但是根据我的定制需求,我想使用spring authorization server和Cognito,基本上:
- 客户端使用其客户端ID访问oauth2/authorize端点
- 重定向到登录页面,spring将知道哪个客户端正在尝试用户登录。
- 客户端在成功登录后从spring收到一个auth代码(通过Cognito,所以auth代码来自spring,但登录应该通过cognito)
- 然后向Spring的token端点发送POST请求,以从Cognito接收access/ID/refresh token。
- 所有应用程序客户端将从Cognito用户池中获取。
我看到了JDBC的例子,但不能真正让它与Cognito一起工作,任何帮助都将不胜感激。
2条答案
按热度按时间ttcibm8c1#
在这方面,我发现来自Ryosuke Uchitate的演示文稿“Want to authenticate using Amazon Cognito? Then use Spring Security!”很有启发性,关于Amazon Cognito与Spring的集成。
你可以在
b1a9id/spring-security-with-cognito
(2018)找到他的实现一般的想法是使用
CognitoService
和AutoWired
annotation来提供AbstractUserDetailsAuthenticationProvider
:对于Cognito服务,您需要将AWS Java SDK for Cognito Identity Provider添加到项目的依赖项中。如果您使用的是Maven,请将以下内容添加到
pom.xml
:服务本身需要适当的AWS凭证、区域和Amazon Cognito配置(客户端ID、客户端密码):
然后您可以配置您的Spring Security以使用自定义身份验证提供程序并设置授权服务器。
但是:如documented here:
在Spring Security 5.7.0-M2(2月2022)我们弃用了
WebSecurityConfigurerAdapter
,因为我们鼓励用户转向基于组件的安全配置。在Spring Security 5.4(Sep.2020)我们引入了通过创建
SecurityFilterChain
bean来配置HttpSecurity
的功能。这意味着更现代的实现将使用
SecurityFilterChain
bean:您需要将原始参数(如
.authenticationProvider(customCognitoAuthenticationProvider)
)传递给新的HttpSecurity http
,如“WebSecurityConfigurerAdapter
Deprecated in Spring Boot”或“Spring Security - How to FixWebSecurityConfigurerAdapter Deprecated
”中所示。然后,使用自定义令牌存储(使用Amazon Cognito的access/ID/refresh令牌)配置Spring Authorization Server(
OAuth2AuthorizationServerConfiguration
)。这意味着要实现一个定制的
TokenStore
,它应该被设计为处理OAuth2令牌(访问令牌、ID令牌和刷新令牌)的存储和检索。在您的案例中:由Amazon Cognito发行的代币。
内存中的(不适合生产)将以以下开头:
正如“TokenStore in Spring Security 5.x after removal of Spring Security OAuth 2.x”中所指出的,您需要检查这是否与Spring Security 5的最新版本兼容。X/6.0+。
根据我的理解(但无法正确测试),使用您的步骤:
1.客户端使用其客户端ID访问
/oauth2/authorize
端点:在
SecurityConfig.java
中:如上所述,如果您使用的是Spring Security 5,则应该在
SecurityFilterChain
中完成此操作。X/6.x。1.重定向到登录页面,Spring将知道哪个客户端正在尝试用户登录:
在
application.yml
中:1.客户端在成功登录后从Spring收到一个auth代码(通过Cognito,所以auth代码来自Spring,但登录应该通过Cognito):
在
SecurityConfig.java
中:在SecurityConfig中配置的重定向端点将负责在成功登录后处理来自Amazon Cognito的回调。验证代码实际上来自Amazon Cognito,而不是Spring。
含义:
/cognito/callback
)沿着作为查询参数的授权码。/cognito/callback
端点的请求,并从查询参数中提取授权代码。1.然后向Spring的令牌端点发送POST请求,以接收Cognito的
access/ID/refresh
令牌:在
CognitoOAuth2LoginSuccessHandler.java
中:1.所有应用程序客户端将从Cognito用户池中获取:
在
CognitoOAuth2UserService.java
中:关于
OAuth2AuthorizationService
:应该不需要直接替换OAuth2AuthorizationService
。Spring Security对OAuth2的内置支持应该负责管理授权代码流,包括将授权代码发送到Amazon Cognito的令牌端点,并将其交换为访问、ID和刷新令牌。
CognitoOAuth2UserService
负责从Amazon Cognito加载用户详细信息,而CognitoOAuth2LoginSuccessHandler
处理成功的身份验证并提供对令牌的访问。fnvucqvd2#
我想我应该在这里添加一些关于OAuth架构的注解,以及我是如何看待它的,因为你的问题有几点看起来不太正确。我不能帮助你在Spring的细节。
角色
客户端在AS处实现代码流。AS向IDP运行另一个代码流。将这些系统链接在一起是非常标准的,应该只需要配置,客户机中的代码更改为零。
注册
已发行代币
客户端总是从AS而不是IDP接收令牌。AS发出令牌来保护您的业务数据。它使您能够发出锁定令牌所需的任何范围和声明。
上游代币
客户端和API通常不需要处理来自IDP的令牌。有时会有例外,例如也使用AWS令牌来访问用户的AWS资源。
如果这是您的要求,请使用嵌入式令牌。这意味着SpringAS发布IDP令牌作为AS令牌的自定义声明。这使您的API能够继续正确授权,同时还能够在需要时访问AWS资源。