¶
Project status: UserHarbor is currently in an early stage of development. The API may change frequently. The library is not ready for production use yet.
UserHarbor is a framework-agnostic Python library for user account management.
Its goal is to provide a simple, stable, and framework-independent interface for common user-related operations:
- user registration
- email verification
- login
- session management
- logout from one or all sessions
- password change
- password reset
- account deletion
- role and permission checks
UserHarbor is not a web framework. It does not provide routers, views, or HTTP endpoints. Instead, it exposes a simple domain-level API that can be integrated with FastAPI, Flask, Django, Litestar, CLI applications, or any other environment.
Installation¶
Install the core package if you want to provide your own UserStore and
EmailSender implementations:
Install the core package with the official SQLAlchemy, SMTP, and FastAPI adapters:
Or install all official integrations at once:
The official adapters are documented in the integrations documentation:
Quick example¶
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from userharbor import UserHarbor
from userharbor_sqlalchemy import SQLAlchemyUserStore
from userharbor_smtp import SMTPEmailSender
engine = create_engine("sqlite:///users.db")
SessionLocal = sessionmaker(bind=engine)
store = SQLAlchemyUserStore(SessionLocal)
store.metadata.create_all(engine)
email_sender = SMTPEmailSender(
host="smtp.example.com",
port=587,
username="smtp-user",
password="smtp-password",
from_email="noreply@example.com",
)
harbor = UserHarbor(
secret_key="your-secret-key",
store=store,
email_sender=email_sender,
)
# Register a user
harbor.register(
username="jane",
email="jane@example.com",
password="StrongPassword123!",
)
# Verify email address
harbor.verify_email("verification-token-from-email")
# Login
session_token = harbor.login(
username="jane",
password="StrongPassword123!",
)
# Verify session
if harbor.verify_session(session_token):
print("User is logged in")
# Get current user
current_user = harbor.get_current_user(session_token)
print(current_user.username)
# Create roles and permissions
harbor.roles.create("admin")
harbor.permissions.create("users.delete")
harbor.roles.grant_permission("admin", "users.delete")
harbor.grant_role("jane", "admin")
# Check access
if harbor.has_permission(session_token, "users.delete"):
print("User can delete users")
current_admin = harbor.require_role(session_token, "admin")
print(current_admin.username)
# Logout
harbor.logout(session_token)
# Change password
session_token = harbor.login(
username="jane",
password="StrongPassword123!",
)
harbor.change_password(
old_password="StrongPassword123!",
new_password="EvenStrongerPassword123!",
session_token=session_token,
)
# Send password reset email
harbor.send_password_reset("jane@example.com")
# Reset password
harbor.reset_password(
new_password="NewStrongPassword123!",
reset_token="reset-token-from-email",
)
# Delete account
session_token = harbor.login(
username="jane",
password="NewStrongPassword123!",
)
harbor.delete_account(
password="NewStrongPassword123!",
session_token=session_token,
)
Full FastAPI example with official integrations¶
Install all official integrations:
Then create a FastAPI application with SQLAlchemy storage, SMTP email delivery, and the FastAPI router adapter:
import os
from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from userharbor import UserHarbor
from userharbor_fastapi import UserHarborFastAPI
from userharbor_smtp import SMTPEmailSender
from userharbor_sqlalchemy import SQLAlchemyUserStore
engine = create_engine("sqlite:///users.db")
SessionLocal = sessionmaker(bind=engine)
store = SQLAlchemyUserStore(SessionLocal)
store.metadata.create_all(engine)
email_sender = SMTPEmailSender(
host=os.getenv("HOST", "smtp.example.com"),
port=int(os.getenv("PORT", 587)),
username=os.getenv("USERNAME"),
password=os.getenv("PASSWORD"),
from_email=os.getenv("USERNAME", ""),
)
harbor = UserHarbor(
secret_key="your-secret-key",
store=store,
email_sender=email_sender,
)
auth = UserHarborFastAPI(harbor)
app = FastAPI()
app.include_router(auth.router, prefix="/auth", tags=["auth"])
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)