# 🔒 NoteDiscovery Authentication Guide

## ⚠️ **IMPORTANT: Default Password Warning**

> **The default `config.yaml` includes authentication disabled by default, with password: `admin`**
>
> 🔴 **CHANGE THIS if you're exposing NoteDiscovery to a network!**
>
> The default configuration is provided for **quick testing only**. Follow the setup guide below to set your own secure password and secret key.

---

## Overview

NoteDiscovery includes a simple, secure authentication system for single-user deployments. When enabled, users must log in with a password before accessing the application.

## ✨ Features

- ✅ **Single User** - Perfect for personal/self-hosted use
- ✅ **Secure** - Passwords hashed with bcrypt
- ✅ **Session-based** - Stay logged in for 7 days (configurable)

---

## 🚀 Quick Setup

**Default Configuration:**
- Authentication is **disabled by default**
- Default password is `admin`
- Default secret key is insecure

**⚠️ IMPORTANT:** For production or network-exposed deployments, **change both the password and secret key immediately**.

---

### 🧪 **Quick Test (Use Default Password)**

For **local testing only**, you can use the default configuration:

1. Start NoteDiscovery (Docker or locally)
2. Navigate to `http://localhost:8000`
3. Log in with password: `admin`

**⚠️ Only use this for local testing on your own machine!**

---

### 🔒 **Production Setup (Change Password & Secret Key)**

For any deployment exposed to a network, follow these steps:

---

## Password Configuration Options

NoteDiscovery supports two ways to set passwords:

| Method | Best For | Security |
|--------|----------|----------|
| **Plain text password** | Docker, PikaPods, easy deployment | Password is hashed at startup |
| **Pre-hashed password** | Advanced users, extra security | You control the hashing |

Both methods are secure - the plain text option simply hashes the password when the app starts.

---

### Option A: Plain Text Password (Recommended for Docker/PikaPods)

The easiest approach - just set your password directly:

**Via Environment Variable:**
```bash
# Docker run
docker run -e AUTHENTICATION_ENABLED=true \
           -e AUTHENTICATION_PASSWORD=your_secure_password \
           ...

# Docker Compose (.env file)
AUTHENTICATION_ENABLED=true
AUTHENTICATION_PASSWORD=your_secure_password
```

**Via config.yaml:**
```yaml
authentication:
  enabled: true
  password: "your_secure_password"
  secret_key: "your_generated_secret_key_here"
```

The password is automatically hashed with bcrypt when the app starts.

---

### Option B: Pre-Hashed Password (Advanced)

For users who prefer to hash passwords themselves:

#### Step 1: Generate a Password Hash

**Docker Users:**

```bash
# Docker Compose with the GHCR compose file
docker-compose -f docker-compose.ghcr.yml exec notediscovery python generate_password.py

# Or with docker run
docker exec -it notediscovery python generate_password.py
```

**Local Users:**

```bash
# Install bcrypt if not already installed
pip install bcrypt

# Run the password generator
python generate_password.py
```

The script will:
1. Prompt you for your password (input is hidden)
2. Ask you to confirm it
3. Generate a bcrypt hash
4. Display the hash with instructions

**Copy the hash** - you'll need it for Step 3.

#### Step 2: Generate a Secret Key

Generate a random secret key for session encryption:

**Docker Users:**
```bash
docker-compose exec notediscovery python -c "import secrets; print(secrets.token_hex(32))"

# Or with docker run
docker exec -it notediscovery python -c "import secrets; print(secrets.token_hex(32))"
```

**Local Users:**
```bash
python -c "import secrets; print(secrets.token_hex(32))"
```

**Copy the key** - you'll need it for Step 3.

#### Step 3: Update `config.yaml`

Edit your `config.yaml` and update the authentication section:

```yaml
authentication:
  # Enable authentication
  enabled: true
  
  # Session secret key (paste the output from Step 2)
  secret_key: "your_generated_secret_key_here"
  
  # Password hash (paste the output from Step 1)
  password_hash: "$2b$12$..."
  
  # Session expiry in seconds (7 days by default)
  session_max_age: 604800
```

---

### Restart the Application

```bash
# If running locally
uvicorn backend.main:app --reload

# If using Docker Compose
docker-compose restart

# Or with docker run
docker restart notediscovery
```

### Test Login

Navigate to `http://localhost:8000` and you'll be redirected to the login page.

Enter the password you configured.

---

## 🔒 Security Considerations

### ✅ What This Protects

- Unauthorized access to your notes
- Viewing, creating, editing, and deleting notes
- All API endpoints

### ⚠️ What This Doesn't Protect

This is a **simple authentication system** designed for **self-hosted, single-user** deployments. It is **NOT** suitable for:

- ❌ Multi-user environments
- ❌ Public internet exposure without HTTPS
- ❌ Production SaaS applications
- ❌ Compliance requirements (HIPAA, GDPR, etc.)

### 🛡️ Best Practices

1. **Use HTTPS** - Always run behind a reverse proxy (Traefik, nginx, Caddy) with SSL/TLS
2. **Strong Password** - Use at least 12 characters with mixed case, numbers, and symbols
3. **Unique Secret Key** - Never reuse secret keys across applications
4. **Keep Config Secure** - Don't commit `config.yaml` with real credentials to version control
5. **VPN/Private Network** - Keep NoteDiscovery on a private network or behind a VPN

---

## 🚫 Disabling Authentication

To disable authentication and allow open access:

```yaml
authentication:
  enabled: false
```

Restart the application, and authentication will be bypassed.