Changed module name from my_auth to myauth
Changed encryption algorithm to argon2 Added unit tests
This commit is contained in:
138
README.md
138
README.md
@@ -22,7 +22,7 @@ with pluggable database backends.
|
||||
* Secure password reset (via secure token stored in DB).
|
||||
* Account activation / deactivation.
|
||||
* **Security:**
|
||||
* Password hashing with `bcrypt` (configurable rounds).
|
||||
* Password hashing with `argon2`.
|
||||
* Strict password validation (uppercase, lowercase, digit, special character).
|
||||
* **Flexible Architecture:**
|
||||
* **Pluggable Backends:** Supports MongoDB, PostgreSQL, and SQLite out of the box.
|
||||
@@ -75,29 +75,16 @@ This example configures myauth to use MongoDB as its backend.
|
||||
```Python
|
||||
|
||||
from fastapi import FastAPI
|
||||
from my_auth import AuthService
|
||||
from my_auth.api import auth_router
|
||||
from my_auth.persistence.mongodb import MongoUserRepository, MongoTokenRepository
|
||||
from myauth import create_app_router_for_mongoDB
|
||||
|
||||
# 1. Initialize FastAPI app
|
||||
app = FastAPI()
|
||||
|
||||
# 2. Configure repositories for MongoDB
|
||||
# Make sure your connection string is correct
|
||||
user_repo = MongoUserRepository(connection_string="mongodb://localhost:27017/myappdb")
|
||||
token_repo = MongoTokenRepository(connection_string="mongodb://localhost:27017/myappdb")
|
||||
auth_router = create_app_router_for_mongoDB(mongodb_url="mongodb://localhost:27017",
|
||||
jwt_secret="THIS_NEEDS_TO_BE_CHANGED")
|
||||
|
||||
# 3. Configure the Authentication Service
|
||||
# IMPORTANT: Change this to a long, random, secret string
|
||||
auth_service = AuthService(
|
||||
user_repository=user_repo,
|
||||
token_repository=token_repo,
|
||||
jwt_secret="YOUR_SUPER_LONG_AND_SECURE_JWT_SECRET_HERE"
|
||||
# email_service will be added in the next step
|
||||
)
|
||||
|
||||
# 4. Include the authentication routes
|
||||
# Endpoints like /auth/login, /auth/register are now active
|
||||
# 3. Include the authentication routes
|
||||
app.include_router(auth_router)
|
||||
|
||||
|
||||
@@ -113,36 +100,18 @@ This example configures myauth to use PostgreSQL as its backend.
|
||||
```Python
|
||||
|
||||
from fastapi import FastAPI
|
||||
from my_auth import AuthService
|
||||
from my_auth.api import auth_router
|
||||
from my_auth.persistence.postgresql import PostgreSQLUserRepository, PostgreSQLTokenRepository
|
||||
from myauth import create_app_router_for_postgreSQL
|
||||
|
||||
# 1. Initialize FastAPI app
|
||||
app = FastAPI()
|
||||
|
||||
# 2. Configure repositories for PostgreSQL
|
||||
# Update with your database credentials
|
||||
db_config = {
|
||||
"host": "localhost",
|
||||
"port": 5432,
|
||||
"database": "mydb",
|
||||
"user": "postgres",
|
||||
"password": "secret"
|
||||
}
|
||||
user_repo = PostgreSQLUserRepository(**db_config)
|
||||
token_repo = PostgreSQLTokenRepository(**db_config)
|
||||
# 2. Configure repositories for MongoDB
|
||||
auth_router = create_app_router_for_mongoDB(postgresql_url="mongodb://localhost:27017",
|
||||
username="admin",
|
||||
password="password",
|
||||
jwt_secret="THIS_NEEDS_TO_BE_CHANGED")
|
||||
|
||||
# 3. Configure the Authentication Service
|
||||
# IMPORTANT: Change this to a long, random, secret string
|
||||
auth_service = AuthService(
|
||||
user_repository=user_repo,
|
||||
token_repository=token_repo,
|
||||
jwt_secret="YOUR_SUPER_LONG_AND_SECURE_JWT_SECRET_HERE"
|
||||
# email_service will be added in the next step
|
||||
)
|
||||
|
||||
# 4. Include the authentication routes
|
||||
# Endpoints like /auth/login, /auth/register are now active
|
||||
# 3. Include the authentication routes
|
||||
app.include_router(auth_router)
|
||||
|
||||
|
||||
@@ -158,30 +127,15 @@ This example configures myauth to use SQLite, which is ideal for development or
|
||||
```Python
|
||||
|
||||
from fastapi import FastAPI
|
||||
from my_auth import AuthService
|
||||
from my_auth.api import auth_router
|
||||
from my_auth.persistence.sqlite import SQLiteUserRepository, SQLiteTokenRepository
|
||||
from myauth import create_app_router_for_sqlite
|
||||
|
||||
# 1. Initialize FastAPI app
|
||||
app = FastAPI()
|
||||
|
||||
# 2. Configure repositories for SQLite
|
||||
# This will create/use a file named 'auth.db' in the current directory
|
||||
db_path = "./auth.db"
|
||||
user_repo = SQLiteUserRepository(db_path=db_path)
|
||||
token_repo = SQLiteTokenRepository(db_path=db_path)
|
||||
# 2. Configure repositories for MongoDB
|
||||
auth_router = create_app_router_for_sqlite(db_path="./UserDB", jwt_secret="THIS_NEEDS_TO_BE_CHANGED")
|
||||
|
||||
# 3. Configure the Authentication Service
|
||||
# IMPORTANT: Change this to a long, random, secret string
|
||||
auth_service = AuthService(
|
||||
user_repository=user_repo,
|
||||
token_repository=token_repo,
|
||||
jwt_secret="YOUR_SUPER_LONG_AND_SECURE_JWT_SECRET_HERE"
|
||||
# email_service will be added in the next step
|
||||
)
|
||||
|
||||
# 4. Include the authentication routes
|
||||
# Endpoints like /auth/login, /auth/register are now active
|
||||
# 3. Include the authentication routes
|
||||
app.include_router(auth_router)
|
||||
|
||||
|
||||
@@ -204,11 +158,14 @@ pip install "myauth[email]"
|
||||
|
||||
```Python
|
||||
|
||||
# ... (keep your app and repository config from the Quick Start)
|
||||
from fastapi import FastAPI
|
||||
from myauth.emailing.smtp import SMTPEmailService
|
||||
from myauth import create_app_router_for_sqlite
|
||||
|
||||
from my_auth.email.smtp import SMTPEmailService
|
||||
# 1. Initialize FastAPI app
|
||||
app = FastAPI()
|
||||
|
||||
# 1. Configure the email service
|
||||
# 2. Configure the email service
|
||||
email_service = SMTPEmailService(
|
||||
host="smtp.gmail.com",
|
||||
port=587,
|
||||
@@ -217,15 +174,12 @@ email_service = SMTPEmailService(
|
||||
use_tls=True
|
||||
)
|
||||
|
||||
# 2. Pass the email service to AuthService
|
||||
auth_service = AuthService(
|
||||
user_repository=user_repo, # From Quick Start
|
||||
token_repository=token_repo, # From Quick Start
|
||||
email_service=email_service, # Add this line
|
||||
jwt_secret="YOUR_SUPER_LONG_AND_SECURE_JWT_SECRET_HERE"
|
||||
)
|
||||
# 3. Configure repositories for MongoDB
|
||||
auth_router = create_app_router_for_sqlite(db_path="./UserDB", jwt_secret="THIS_NEEDS_TO_BE_CHANGED",
|
||||
email_service=email_service)
|
||||
|
||||
# ... (keep 'app.include_router(auth_router)')
|
||||
# 4. Include the authentication routes
|
||||
app.include_router(auth_router)
|
||||
```
|
||||
|
||||
### Option 2: Create a Custom Email Service
|
||||
@@ -234,9 +188,12 @@ If you use a third-party service (like AWS SES, Mailgun) that requires an API, y
|
||||
|
||||
```Python
|
||||
|
||||
# ... (keep your app and repository config from the Quick Start)
|
||||
from fastapi import FastAPI
|
||||
from myauth.emailing.base import EmailService
|
||||
from myauth import create_app_router_for_sqlite
|
||||
|
||||
from my_auth.email.base import EmailService
|
||||
# 1. Initialize FastAPI app
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
# 1. Implement your custom email service
|
||||
@@ -263,14 +220,12 @@ class CustomEmailService(EmailService):
|
||||
email_service = CustomEmailService(api_key="YOUR_API_KEY_HERE")
|
||||
|
||||
# 3. Pass your custom service to AuthService
|
||||
auth_service = AuthService(
|
||||
user_repository=user_repo, # From Quick Start
|
||||
token_repository=token_repo, # From Quick Start
|
||||
email_service=email_service, # Add this line
|
||||
jwt_secret="YOUR_SUPER_LONG_AND_SECURE_JWT_SECRET_HERE"
|
||||
)
|
||||
auth_router = create_app_router_for_sqlite(db_path="./UserDB", jwt_secret="THIS_NEEDS_TO_BE_CHANGED",
|
||||
email_service=email_service)
|
||||
|
||||
# 4. Include the authentication routes
|
||||
app.include_router(auth_router)
|
||||
|
||||
# ... (keep 'app.include_router(auth_router)')
|
||||
```
|
||||
|
||||
## API Endpoints Reference
|
||||
@@ -302,25 +257,6 @@ The module uses custom exceptions that are automatically converted to the approp
|
||||
* `EmailNotVerifiedError` → **403 Forbidden (on login attempt)**
|
||||
* `AccountDisabledError` → **403 Forbidden (on login attempt)**
|
||||
|
||||
## Configuration Options
|
||||
|
||||
All options are passed during the `AuthService` initialization:
|
||||
|
||||
```Python
|
||||
|
||||
AuthService(
|
||||
user_repository: UserRepository, # Required
|
||||
token_repository: TokenRepository, # Required
|
||||
jwt_secret: str, # Required
|
||||
jwt_algorithm: str = "HS256", # Optional
|
||||
access_token_expire_minutes: int = 30, # Optional
|
||||
refresh_token_expire_days: int = 7, # Optional
|
||||
password_reset_token_expire_minutes: int = 15, # Optional
|
||||
password_hash_rounds: int = 12, # Optional (bcrypt cost)
|
||||
email_service: EmailService = None # Optional
|
||||
)
|
||||
```
|
||||
|
||||
## Appendix (Contributor & Development Details)
|
||||
|
||||
<details> <summary><b> Appendix A: Project Structure (src/my_auth)</b></summary>
|
||||
|
||||
Reference in New Issue
Block a user