Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring security验证来自Google的访问令牌_Java_Spring Security Oauth2_Openid Connect_Google Authentication - Fatal编程技术网

Java 使用spring security验证来自Google的访问令牌

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[...

我试图通过给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[...]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的请求正在发送一个请求,并且无法解析数据。(没有“值”道具)。很抱歉回复晚了。我在这篇博文中解决了这个问题:我最终继续沿着这条路走下去,但我们正在研究一个类似于这样的内部解决方案:谢谢。“我最后做了一件非常类似的事情,很有效。”黑根,请告诉我们你做了什么