com.amazonaws
aws-java-sdk-cognitoidp
${aws-sdk.version}
@Configuration
@EnableWebSecurity
@EnableResourceServer
public class SecurityConfig extends ResourceServerConfigurerAdapter {
@Value("${aws.cognito.client-id}")
private String clientId;
@Value("${aws.cognito.pool-id}")
private String poolId;
@Value("${aws.cognito.region}")
private String region;
@Autowired
private CognitoAccessTokenConverter cognitoAccessTokenConverter;
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated();
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenStore(tokenStore()).resourceId(clientId);
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setAccessTokenConverter(cognitoAccessTokenConverter);
return converter;
}
@Bean
public CognitoAccessTokenConverter cognitoAccessTokenConverter() {
return new CognitoAccessTokenConverter();
}
}
在这里,我们使用了 CognitoAccessTokenConverter
来将 JWT 令牌转换为包含 AWS Cognito 用户池中用户信息的 JSON。然后,该令牌被转换为 JwtAccessTokenConverter
对象以便在 Spring Security 中使用。
@Component
public class JwtTokenExtractor {
public static final String BEARER_TYPE = "Bearer ";
public String extract(String header) {
if (StringUtils.isEmpty(header)) {
throw new RuntimeException("Authorization header is missing");
}
if (header.length() < BEARER_TYPE.length()) {
throw new RuntimeException("Invalid authorization header size");
}
return header.substring(BEARER_TYPE.length());
}
}