# Technical Details: Authentication & Infrastructure

This document explains the "Hybrid" approach we use for managing Authentication infrastructure on Google Cloud Platform (GCP).

## 🏗 The Architecture

We use **Terraform** to manage our "Infrastructure as Code". This gives us reproducibility and version control. However, Authentication involves sensitive credentials that have security restrictions preventing full automation.

### Components
1.  **Firebase Auth (Identity Platform)**: Handles user login (Google Sign-In).
2.  **Firestore**: database storing the "Allowlist" of approved emails.
3.  **Secret Manager**: securely stores the OAuth credentials used by Identity Platform.

## 🔐 The "Client Secret" Dilemma

### 1. Why is there a Manual Step?
When you enable Firebase Authentication, Google creates an **OAuth 2.0 Client ID** for your web application. This Client ID comes with a **Client Secret**.

**The Restriction**: Google Cloud's security model **does not allow** retrieving an existing Client Secret via the API or CLI (`gcloud`). It is only visible:
1.  At the moment of creation.
2.  In the GCP Console UI (where you can "download JSON").

> [!IMPORTANT]
> **"Browser key" vs "OAuth Client"**:
> You might see a "Browser key (auto created by Firebase)" in the console. This is an **API Key**, which is public and safe to share.
> **However**, for the Identity Platform backend configuration (`google_identity_platform_default_supported_idp_config`), we strictly need the **OAuth 2.0 Client Secret**, which acts as a password for the server. Do not confuse the two!

Because Terraform interacts via the API, it **cannot** fetch this secret on its own. If we tried to create a *new* Client ID via Terraform, we would hit another blocker: the **OAuth Consent Screen** requires manual configuration in the Console.

### 2. The Solution: "Bootstrap" Script
To bridge this gap, we use a "Bootstrap" workflow:

1.  **Creation**: Firebase auto-creates the credentials.
2.  **Retrieval**: You manually copy them from the Console (the only place they are visible).
3.  **Storage**: You run `scripts/manage_secrets.py` to save them into **Google Secret Manager**.
4.  **Consumption**: Terraform reads the secure values from Secret Manager to configure the Identity Provider.

## 🔄 Authentication Flow

1.  **User Visits Site**: The Vue.js app initializes Firebase using public config (API Key, Auth Domain).
2.  **Login**: User clicks "Login". The app invokes `signInWithPopup(googleProvider)`.
    *   Google checks the allow-listed domains (`localhost`, `*.firebaseapp.com`).
    *   The "Client ID" is used to identify the app to Google.
3.  **Token Exchange**: Identity Platform validates the user's Google credentials using the **Client Secret** (configured via Terraform).
4.  **Success**: If valid, the user is signed in.
5.  **Authorization**: The app watches `config/allowlist` in Firestore.
    *   If `user.email` is in the list -> **Banner: "Do bist a haumdaucher"**.
    *   If not -> Access is restricted.

## 📝 Terraform Resources involved
*   `google_identity_platform_default_supported_idp_config`: Configures the "Google" provider.
*   `data "google_secret_manager_secret_version"`: Fetches the stored credentials.
*   `google_firestore_document`: Manages the allowlist.
