Java 使用spring security验证来自Google的访问令牌
我试图通过给spring boot后端一个我从Google获得的访问令牌来验证API调用 从我对文档的理解来看,只要声明Java 使用spring security验证来自Google的访问令牌,java,spring-security-oauth2,openid-connect,google-authentication,Java,Spring Security Oauth2,Openid Connect,Google Authentication,我试图通过给spring boot后端一个我从Google获得的访问令牌来验证API调用 从我对文档的理解来看,只要声明 security.oauth2.resource.jwk.key-set-uri=https://www.googleapis.com/oauth2/v3/certs 在application.properties文件中,启用资源服务器和web安全 正在表单的标头中发送令牌 'Authorization': 'Bearer ya29.ImCQBz5-600zVNsB[...
security.oauth2.resource.jwk.key-set-uri=https://www.googleapis.com/oauth2/v3/certs
在application.properties
文件中,启用资源服务器和web安全
正在表单的标头中发送令牌
'Authorization': 'Bearer ya29.ImCQBz5-600zVNsB[...]ka-x5kC[...]hvw-BGf3m5Bck-HF[...]44'
当我尝试进行身份验证时,会出现401未经授权的错误,并出现以下控制台错误:
OAuth2AuthenticationProcessingFilter: Authentication request failed: error="invalid_token", error_description="An I/O error occurred while reading the JWT: Invalid UTF-8 start byte 0xad at [Source: (byte[])"??"; line: 1, column: 3]
我希望尽我所能使用spring安全库的大部分功能,但我已经尝试编写自己的用于令牌管理的简单bean
@配置
@EnableResourceServer
@启用Web安全性
公共类ResourceServerConfiguration扩展了ResourceServerConfigurerAdapter{
@凌驾
public void configure(HttpSecurity http)引发异常{
http.authorizeRequests().anyRequest().hasRole(“用户”);
}
@豆子
公共令牌库令牌库(){
返回新的JWKTokeStore(“https://www.googleapis.com/oauth2/v3/certs");
}
@豆子
@初级的
公共DefaultTokenServices令牌服务(){
DefaultTokenServices DefaultTokenServices=新的DefaultTokenServices();
setTokenStore(tokenStore());
返回服务;
}
@凌驾
public void配置(ResourceServerSecurityConfigure配置){
config.tokenServices(tokenServices());
}
}
我希望验证令牌并能够显示信息
我是否需要编写自己的函数来处理此问题?也许您必须实现WebSecurity配置适配器
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class RestSecurityConfig extends WebSecurityConfigurerAdapter {
private final AADAppRoleStatelessAuthenticationFilter appRoleAuthFilter;
private final RestAuthenticationEntryPoint unauthorizedHandler;
private final RestAccessDeniedHandler accessDeniedHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.authorizeRequests()
.antMatchers("/actuator/refresh").hasRole("Admin")
.antMatchers("/actuator/health").permitAll()
.anyRequest().fullyAuthenticated();
http.addFilterBefore(appRoleAuthFilter, UsernamePasswordAuthenticationFilter.class);
http.exceptionHandling()
.accessDeniedHandler(accessDeniedHandler)
.authenticationEntryPoint(unauthorizedHandler);
}
}
我也有同样的问题。
事实证明,您需要导入特定的jwt依赖项,默认的oauth2依赖项将不适用于键集uri
我使用的从属关系:
'org.springframework.cloud:spring-cloud-starter-security',
'org.springframework.security:spring-security-oauth2-jose',
'org.springframework.security:spring-security-oauth2-resource-server',
第二个是最重要的。
现在,您将在类路径上拥有JwtDecoder
和NimbusJwtDecoderJwkSupport
,您可以配置SpringBoot。
这是我的设置:
@NoArgsConstructor
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class WebAppConfig extends WebSecurityConfigurerAdapter {
@Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
private String issuer;
@Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}")
private String jwkSetUri;
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
...
.and()
.oauth2ResourceServer()
.jwt()
.decoder(decoder());
}
private JwtDecoder decoder() {
List<OAuth2TokenValidator<Jwt>> validators = new ArrayList<>();
validators.add(new JwtTimestampValidator());
validators.add(new JwtIssuerValidator(issuer));
validators.add(new TokenSupplierValidator(List.of(StringUtils.split(androidClientId,","))));
NimbusJwtDecoderJwkSupport decoder = new NimbusJwtDecoderJwkSupport(jwkSetUri)
decoder.setJwtValidator(new DelegatingOAuth2TokenValidator<>(validators));
return decoder;
}
}
@noargsconstuctor
@配置
@启用Web安全性
@EnableGlobalMethodSecurity(Prespenabled=true)
类WebAppConfig扩展了WebSecurity配置适配器{
@值(${spring.security.oauth2.resourceserver.jwt.issuer uri}”)
私人字符串发行人;
@值(${spring.security.oauth2.resourceserver.jwt.jwk set uri}”)
私有字符串jwkSetUri;
@凌驾
public void configure(HttpSecurity http)引发异常{
http
.csrf().disable()
...
.及()
.oauth2ResourceServer()
.jwt()
.decoder(decoder());
}
专用JWT解码器(){
列表验证器=新的ArrayList();
add(新的JwtTimestampValidator());
添加(新的JwtIssuerValidator(发行人));
add(新的TokenSupplierValidator(List.of(StringUtils.split(androidClientId,“,”)));
NimbusJwtDecoderJwkSupport解码器=新的NimbusJwtDecoderJwkSupport(jwkSetUri)
解码器.setJwtValidator(新的DelegatingAuth2TokenValidator(验证器));
返回解码器;
}
}
如果您只需要默认的JWT令牌验证,那么可以使用默认验证(无需设置自定义验证程序)
希望这有帮助 不幸的是,这似乎不是问题。你的问题解决了吗?我也有类似的问题。我同时使用
security.oauth2.resource.jwk.key set uri
和spring.security.oauth2.resourceserver.jwt.jwk set uri
我遇到的问题是,在配置时调用jwk的请求正在发送一个请求,并且无法解析数据。(没有“值”道具)。很抱歉回复晚了。我在这篇博文中解决了这个问题:我最终继续沿着这条路走下去,但我们正在研究一个类似于这样的内部解决方案:谢谢。“我最后做了一件非常类似的事情,很有效。”黑根,请告诉我们你做了什么