gpt4 book ai didi

firebase - Spring Boot REST api 验证 Firebase JWT token

转载 作者:行者123 更新时间:2023-12-05 04:48:29 25 4
gpt4 key购买 nike

我有一个 Springboot REST 应用程序,我正在尝试使用 firebase 保护它,用户身份验证流程如下:

  1. 用户使用 firebase auth 在单独的 Vue 前端进行身份验证,获取 Firebase JWT id token 。
  2. 前端将身份验证 header 中的此 token 发送到我的后端。
  3. 然后我的后端应该获取 token ,并通过将 token 发送到 Firebase 服务器来进行身份验证。
  4. 如果 token 有效,则返回用户请求的任何资源,它不会返回 401。

我已经配置了前端代码,现在在每个请求中发送 JWT token 。我正在尝试设置后端,但遇到了一些问题。

我已将 firebase SDK 管理员添加到我的应用程序中,初始化了 Firebase 应用程序,并实现了一个 HTTP 过滤器来过滤所有请求以检查和验证 token 。我一直在关注this tutorial来自 firebase 的身份验证 token 。出于某种原因,我所有的请求都返回 403?我不太确定我的实现出了什么问题,因为没有要修复的错误。

我的 pom xml 片段:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-admin</artifactId>
<version>7.3.0</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client</artifactId>
<version>1.39.2</version>
</dependency>

用于初始化 firebase SDK 的我的 firebase 类:

@Service
public class FirebaseInitialization {

@PostConstruct
public void initialization() {

try{
FileInputStream inputStream = new FileInputStream("src/main/resources/serviceAccountKey.json");
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(inputStream))
.build();

FirebaseApp.initializeApp(options);
}
catch (Exception error) {
error.printStackTrace();
}

}
}

我的安全配置类:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter {

private static final String[] AUTH_WHITELIST = {"/publicEndpoint"};

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors().and()
.csrf().disable()
.addFilterAfter(new FireBaseTokenFilter(), FireBaseTokenFilter.class)
.sessionManagement().sessionCreationPolicy(STATELESS).and()
.authorizeRequests()
.antMatchers(AUTH_WHITELIST).permitAll()
.anyRequest().authenticated();

http.headers().frameOptions().disable();
}
}

我的 HTTP 过滤器检查 firebase token :

public class FireBaseTokenFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
String authenticationHeader = request.getHeader("Authorization");

//checks if token is there
if (authenticationHeader == null || !authenticationHeader.startsWith("Bearer "))
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED,"Missing token!");

FirebaseToken decodedToken = null;
try {
//Extracts token from header
String token = authenticationHeader.substring(7, authenticationHeader.length());
//verifies token to firebase server
decodedToken = FirebaseAuth.getInstance().verifyIdToken(token);
}
catch (FirebaseAuthException e) {
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED,"Error! "+e.toString());
}

//if token is invalid
if (decodedToken==null){
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED,"Invalid token!");
}

chain.doFilter(request,response);
}
}

最佳答案

您收到 403 响应,这意味着您的过滤器未运行(过滤器中的所有响应都是 401 响应)。如果您查看您的配置,在这一行中:

.addFilterAfter(new FireBaseTokenFilter(), FireBaseTokenFilter.class) 您告诉 Spring 注册一个新的 FireBaseTokenFilter,它应该在 FireBaseTokenFilter 之后调用。这不会起作用,因为您还没有注册 FireBase 过滤器。

如果将该行更改为 addFilterBefore(new FireBaseTokenFilter(), UsernamePasswordAuthenticationFilter.class),现在将调用过滤器。不过,您仍然需要一种方法来告诉 Spring 用户已通过身份验证。您的过滤器将拒绝带有无效 token 的请求,但我认为它仍然会拒绝带有有效 token 的请求。在 securing APIs in Spring 上查看本教程检查如何配置资源服务器以接受 JWT。

另请注意,FireBase SDK 会验证 ID token ,但不会调用 FireBase 服务器。 SDK 验证 token 的签名和其中的一些声明。

关于firebase - Spring Boot REST api 验证 Firebase JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68062611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com