Spring Boot中的Firebase身份驗證+Firestore整合原始碼

banq發表於2024-03-20


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 的檔案,並將服務賬戶私鑰的內容貼上到該檔案中。
 

相關文章