133 lines
3.2 KiB
Markdown
133 lines
3.2 KiB
Markdown
# User Authentication Service
|
|
|
|
A FastAPI-based user authentication service with JWT token authentication.
|
|
|
|
## Features
|
|
|
|
- User registration and login
|
|
- JWT-based authentication
|
|
- Password hashing with bcrypt
|
|
- SQLite database with SQLAlchemy ORM
|
|
- Alembic migrations
|
|
- Protected routes with OAuth2 dependencies
|
|
- Health check endpoint
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
.
|
|
├── alembic.ini
|
|
├── app
|
|
│ ├── api
|
|
│ │ ├── deps.py
|
|
│ │ ├── endpoints
|
|
│ │ │ ├── auth.py
|
|
│ │ │ ├── health.py
|
|
│ │ │ └── users.py
|
|
│ │ └── routes.py
|
|
│ ├── core
|
|
│ │ ├── config.py
|
|
│ │ └── security.py
|
|
│ ├── crud
|
|
│ │ ├── base.py
|
|
│ │ └── user.py
|
|
│ ├── db
|
|
│ │ ├── base.py
|
|
│ │ ├── base_class.py
|
|
│ │ └── session.py
|
|
│ ├── models
|
|
│ │ └── user.py
|
|
│ ├── schemas
|
|
│ │ ├── token.py
|
|
│ │ └── user.py
|
|
│ └── utils
|
|
├── main.py
|
|
├── migrations
|
|
│ ├── env.py
|
|
│ └── versions
|
|
│ └── 0001_create_users_table.py
|
|
└── requirements.txt
|
|
```
|
|
|
|
## Setup
|
|
|
|
1. Clone the repository:
|
|
|
|
```bash
|
|
git clone <repository-url>
|
|
cd userauthenticationservice
|
|
```
|
|
|
|
2. Create a virtual environment and install dependencies:
|
|
|
|
```bash
|
|
python -m venv venv
|
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
3. Set up environment variables:
|
|
|
|
Create a `.env` file in the root directory with the following content:
|
|
|
|
```
|
|
SECRET_KEY=your-secret-key
|
|
ACCESS_TOKEN_EXPIRE_MINUTES=10080 # 7 days
|
|
```
|
|
|
|
4. Run database migrations:
|
|
|
|
```bash
|
|
alembic upgrade head
|
|
```
|
|
|
|
5. Run the application:
|
|
|
|
```bash
|
|
uvicorn main:app --reload
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### Authentication
|
|
|
|
- **POST /auth/register**: Register a new user
|
|
- Request: `{ "email": "user@example.com", "username": "username", "password": "password" }`
|
|
- Response: User object
|
|
|
|
- **POST /auth/login**: Login and get access token
|
|
- Request: Form data with `username` (email) and `password`
|
|
- Response: `{ "access_token": "token", "token_type": "bearer" }`
|
|
|
|
### Users
|
|
|
|
- **GET /users/me**: Get current user details (requires authentication)
|
|
- Response: User object
|
|
|
|
- **PUT /users/me**: Update current user details (requires authentication)
|
|
- Request: `{ "email": "new-email@example.com", "username": "new-username", "password": "new-password" }`
|
|
- Response: Updated user object
|
|
|
|
### Health Check
|
|
|
|
- **GET /health**: Check API health
|
|
- Response: `{ "status": "healthy", "database": "healthy" }`
|
|
|
|
## Authentication
|
|
|
|
The API uses JWT tokens for authentication. To access protected endpoints, include the token in the Authorization header:
|
|
|
|
```
|
|
Authorization: Bearer <your-token>
|
|
```
|
|
|
|
## Database
|
|
|
|
The application uses SQLite as the database, with the file stored at `/app/storage/db/db.sqlite`.
|
|
SQLAlchemy is used as the ORM, and Alembic for database migrations.
|
|
|
|
## Environment Variables
|
|
|
|
- `SECRET_KEY`: Secret key used for JWT token generation
|
|
- `ACCESS_TOKEN_EXPIRE_MINUTES`: Token expiration time in minutes (default: 10080 - 7 days)
|
|
- `BACKEND_CORS_ORIGINS`: List of allowed CORS origins (default: "*") |