Spring Boot中的Firebase身份验证+Firestore集成源码


Java Spring-boot 应用程序将 Firestore 数据库和 Firebase 身份验证与 Spring-Security 集成以构建 CRUD 应用程序

参考概念验证,利用Firestore 数据库执行 CRUD 操作,并 使用 Spring-Security 进行Firebase 身份验证来对用户进行身份验证。

升级到 Spring Boot 3 和 Spring Security 6

应用程序流程和安全配置
该项目模拟了一个初级任务管理应用程序。

通过使用自定义注解 @PublicEndpoint 对相应的控制器方法进行注解,涉及用户账户创建和登录凭证验证的 API 端点被公开。对已配置 API 路径的请求将不会通过安全过滤器进行评估,其逻辑由 ApiEndpointSecurityInspector 管理。

下面是一个控制器方法示例,该方法被声明为公共方法,将免于身份验证检查:

@PublicEndpoint
@PostMapping(value = "/login")
public ResponseEntity<TokenSuccessResponse> login(@RequestBody UserLoginRequest userLoginRequest) {
  final var response = userService.login(userLoginRequest);
  return ResponseEntity.ok(response);
}

添加到安全过滤器链并在 SecurityConfiguration 中配置的 JwtAuthenticationFilter 会拦截对私有端点的 API 请求,以处理对任务实体的 CRUD 操作。自定义过滤器负责通过与 Firebase 身份验证服务通信和填充安全上下文来验证传入访问令牌的真实性。

验证成功后,AuthenticatedUserIdProvider 负责从安全上下文中检索已验证的用户 ID。这有助于服务层维护当前已通过身份验证的用户与其相应任务之间的关系。如果已通过身份验证的用户试图对不属于自己的任务执行任何操作,则会向客户端发回以下 API 响应。

{
  "Status": "403 FORBIDDEN",
 
"Description": "Access Denied: Insufficient privileges to perform this action."
}

如果身份验证失败,HTTP 请求头中收到的访问令牌无效,则会向客户端发送以下 API 响应。

{
  "Status": "401 UNAUTHORIZED",
 
"Description": "Authentication failure: Token missing, invalid or expired"
}

上述 JSON 响应是根据 SecurityConfiguration 中配置的 CustomAuthenticationEntryPoint 发送给客户端的,它假定安全过滤器抛出的任何异常都是由于令牌验证失败造成的。因此,该实现实例化了 TokenVerificationException,并将处理异常的责任委托给 ExceptionResponseHandler。

本地设置
要在本地运行应用程序,请确保具备以下先决条件:

  • 与服务账户关联的私人密钥,以便与 Firebase 建立连接。
  • 为调用 Firebase Authentication REST API 而创建的 Firebase 项目的 Web API 密钥。
  • 创建的 Firebase 身份验证服务已启用电子邮件/密码本地登录提供程序。

在基础目录中创建名为 private-key.json 的文件,并将服务账户私钥的内容粘贴到该文件中。