From fdf1e0e8ed5ec69c42408179ace73f945bf94dea Mon Sep 17 00:00:00 2001 From: mahmamdouh Date: Sun, 25 Jan 2026 14:36:01 +0100 Subject: [PATCH] sso --- Dockerfile | 13 ++ Nabd.png | Bin 0 -> 84730 bytes backend/auth_utils.py | 56 ++++++++ backend/database.py | 19 +++ backend/main.py | 53 +++++++ backend/models.py | 40 ++++++ backend/routers/apps.py | 33 +++++ backend/routers/auth.py | 22 +++ backend/routers/sso.py | 31 ++++ backend/routers/users.py | 78 +++++++++++ backend/schemas.py | 63 +++++++++ backend/services/email.py | 45 ++++++ caddy_config.txt | 7 + deploy.sh | 15 ++ docker-compose.yml | 25 ++++ docs/api_reference.md | 140 ++++++++++++++++++ docs/user_guide.md | 61 ++++++++ frontend/index.html | 150 ++++++++++++++++++++ frontend/static/css/style.css | 152 ++++++++++++++++++++ frontend/static/img/logo.png | Bin 0 -> 84730 bytes frontend/static/js/app.js | 257 ++++++++++++++++++++++++++++++++++ requirements.txt | 9 ++ 22 files changed, 1269 insertions(+) create mode 100644 Dockerfile create mode 100644 Nabd.png create mode 100644 backend/auth_utils.py create mode 100644 backend/database.py create mode 100644 backend/main.py create mode 100644 backend/models.py create mode 100644 backend/routers/apps.py create mode 100644 backend/routers/auth.py create mode 100644 backend/routers/sso.py create mode 100644 backend/routers/users.py create mode 100644 backend/schemas.py create mode 100644 backend/services/email.py create mode 100644 caddy_config.txt create mode 100644 deploy.sh create mode 100644 docker-compose.yml create mode 100644 docs/api_reference.md create mode 100644 docs/user_guide.md create mode 100644 frontend/index.html create mode 100644 frontend/static/css/style.css create mode 100644 frontend/static/img/logo.png create mode 100644 frontend/static/js/app.js create mode 100644 requirements.txt diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..133eaa4 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.9-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY backend ./backend +COPY frontend ./frontend + +WORKDIR /app/backend + +CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8001"] diff --git a/Nabd.png b/Nabd.png new file mode 100644 index 0000000000000000000000000000000000000000..c445709762d0b4655ac928ef0982a009b509f2fa GIT binary patch literal 84730 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◊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

|O^tVI$vV99hw=9W2Y=ZMqy?PTZ9 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 cWq+9tI%rboFyt=akR{0HjRpbN~PV literal 0 HcmV?d00001 diff --git a/backend/auth_utils.py b/backend/auth_utils.py new file mode 100644 index 0000000..5a497e9 --- /dev/null +++ b/backend/auth_utils.py @@ -0,0 +1,56 @@ +from passlib.context import CryptContext +from datetime import datetime, timedelta +from typing import Optional +from jose import JWTError, jwt +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer +from sqlalchemy.orm import Session +from . import models, schemas, database + +# Configuration +SECRET_KEY = "ASF_SSO_SUPER_SECRET_KEY_CHANGE_THIS_IN_PROD" +ALGORITHM = "HS256" +ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 # 1 day + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") + +def verify_password(plain_password, hashed_password): + return pwd_context.verify(plain_password, hashed_password) + +def get_password_hash(password): + return pwd_context.hash(password) + +def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): + to_encode = data.copy() + if expires_delta: + expire = datetime.utcnow() + expires_delta + else: + expire = datetime.utcnow() + timedelta(minutes=15) + to_encode.update({"exp": expire}) + encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) + return encoded_jwt + +async def get_current_user(token: str = Depends(oauth2_scheme), db: Session = Depends(database.get_db)): + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + token_data = schemas.TokenData(username=username) + except JWTError: + raise credentials_exception + user = db.query(models.User).filter(models.User.username == token_data.username).first() + if user is None: + raise credentials_exception + return user + +async def get_current_admin_user(current_user: models.User = Depends(get_current_user)): + if not current_user.is_admin: + raise HTTPException(status_code=400, detail="Inactive user or not admin") + return current_user diff --git a/backend/database.py b/backend/database.py new file mode 100644 index 0000000..e6870cf --- /dev/null +++ b/backend/database.py @@ -0,0 +1,19 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +SQLALCHEMY_DATABASE_URL = "sqlite:///./sso.db" + +engine = create_engine( + SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} +) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base = declarative_base() + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..d861775 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,53 @@ +from fastapi import FastAPI, Depends +from fastapi.staticfiles import StaticFiles +from fastapi.middleware.cors import CORSMiddleware +from .database import engine, Base, SessionLocal +from .routers import auth, users, apps, sso +from . import models, auth_utils +from sqlalchemy.orm import Session + +# Create tables +Base.metadata.create_all(bind=engine) + +app = FastAPI(title="ASF SSO Service") + +# CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# Routers +app.include_router(auth.router) +app.include_router(users.router) +app.include_router(apps.router) +app.include_router(sso.router) + +# Mount static files (Frontend) +app.mount("/", StaticFiles(directory="../frontend", html=True), name="static") + +# Create initial admin user if not exists +def create_initial_admin(): + db = SessionLocal() + try: + admin = db.query(models.User).filter(models.User.username == "admin").first() + if not admin: + print("Creating initial admin user...") + hashed_pwd = auth_utils.get_password_hash("admin") # Default password, should be changed + admin_user = models.User( + username="admin", + email="admin@nabd-co.com", + hashed_password=hashed_pwd, + is_admin=True, + is_active=True + ) + db.add(admin_user) + db.commit() + print("Admin user created.") + finally: + db.close() + +create_initial_admin() diff --git a/backend/models.py b/backend/models.py new file mode 100644 index 0000000..b501ccf --- /dev/null +++ b/backend/models.py @@ -0,0 +1,40 @@ +from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, DateTime +from sqlalchemy.orm import relationship +from datetime import datetime +from .database import Base + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + username = Column(String, unique=True, index=True) + email = Column(String, unique=True, index=True) + hashed_password = Column(String) + is_active = Column(Boolean, default=True) + is_admin = Column(Boolean, default=False) + created_at = Column(DateTime, default=datetime.utcnow) + updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) + + applications = relationship("UserApplication", back_populates="user") + +class Application(Base): + __tablename__ = "applications" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String, unique=True, index=True) + api_key = Column(String, unique=True, index=True) # Secret key for the app to talk to SSO + url = Column(String) + created_at = Column(DateTime, default=datetime.utcnow) + + users = relationship("UserApplication", back_populates="application") + +class UserApplication(Base): + __tablename__ = "user_applications" + + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("users.id")) + application_id = Column(Integer, ForeignKey("applications.id")) + assigned_at = Column(DateTime, default=datetime.utcnow) + + user = relationship("User", back_populates="applications") + application = relationship("Application", back_populates="users") diff --git a/backend/routers/apps.py b/backend/routers/apps.py new file mode 100644 index 0000000..f0dadb4 --- /dev/null +++ b/backend/routers/apps.py @@ -0,0 +1,33 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session +from typing import List +import secrets +from .. import database, models, schemas, auth_utils + +router = APIRouter( + prefix="/apps", + tags=["Applications"], + dependencies=[Depends(auth_utils.get_current_admin_user)] +) + +@router.post("/", response_model=schemas.ApplicationOut) +async def create_application(app: schemas.ApplicationCreate, db: Session = Depends(database.get_db)): + db_app = db.query(models.Application).filter(models.Application.name == app.name).first() + if db_app: + raise HTTPException(status_code=400, detail="Application already exists") + + api_key = secrets.token_urlsafe(32) + db_app = models.Application( + name=app.name, + url=app.url, + api_key=api_key + ) + db.add(db_app) + db.commit() + db.refresh(db_app) + return db_app + +@router.get("/", response_model=List[schemas.ApplicationOut]) +async def read_applications(skip: int = 0, limit: int = 100, db: Session = Depends(database.get_db)): + apps = db.query(models.Application).offset(skip).limit(limit).all() + return apps diff --git a/backend/routers/auth.py b/backend/routers/auth.py new file mode 100644 index 0000000..04605e5 --- /dev/null +++ b/backend/routers/auth.py @@ -0,0 +1,22 @@ +from fastapi import APIRouter, Depends, HTTPException, status +from fastapi.security import OAuth2PasswordRequestForm +from sqlalchemy.orm import Session +from .. import database, models, auth_utils, schemas +from datetime import timedelta + +router = APIRouter(tags=["Authentication"]) + +@router.post("/token", response_model=schemas.Token) +async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(database.get_db)): + user = db.query(models.User).filter(models.User.username == form_data.username).first() + if not user or not auth_utils.verify_password(form_data.password, user.hashed_password): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + access_token_expires = timedelta(minutes=auth_utils.ACCESS_TOKEN_EXPIRE_MINUTES) + access_token = auth_utils.create_access_token( + data={"sub": user.username}, expires_delta=access_token_expires + ) + return {"access_token": access_token, "token_type": "bearer"} diff --git a/backend/routers/sso.py b/backend/routers/sso.py new file mode 100644 index 0000000..867f964 --- /dev/null +++ b/backend/routers/sso.py @@ -0,0 +1,31 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session +from .. import database, models, schemas, auth_utils + +router = APIRouter(tags=["SSO"]) + +@router.post("/verify", response_model=schemas.SSOVerifyResponse) +async def verify_user(request: schemas.SSOVerifyRequest, db: Session = Depends(database.get_db)): + # 1. Validate API Key + app = db.query(models.Application).filter(models.Application.api_key == request.api_key).first() + if not app: + raise HTTPException(status_code=403, detail="Invalid API Key") + + # 2. Validate User Credentials + user = db.query(models.User).filter(models.User.username == request.username).first() + if not user or not auth_utils.verify_password(request.password, user.hashed_password): + return {"authorized": False, "message": "Invalid username or password"} + + if not user.is_active: + return {"authorized": False, "message": "User account is inactive"} + + # 3. Check Assignment + assignment = db.query(models.UserApplication).filter( + models.UserApplication.user_id == user.id, + models.UserApplication.application_id == app.id + ).first() + + if not assignment: + return {"authorized": False, "message": "User not authorized for this application"} + + return {"authorized": True, "message": "Authorized", "user": user} diff --git a/backend/routers/users.py b/backend/routers/users.py new file mode 100644 index 0000000..4e9122f --- /dev/null +++ b/backend/routers/users.py @@ -0,0 +1,78 @@ +from fastapi import APIRouter, Depends, HTTPException, status, BackgroundTasks +from sqlalchemy.orm import Session +from typing import List +from .. import database, models, schemas, auth_utils +from ..services import email + +router = APIRouter( + prefix="/users", + tags=["Users"], + dependencies=[Depends(auth_utils.get_current_admin_user)] +) + +@router.post("/", response_model=schemas.UserOut) +async def create_user(user: schemas.UserCreate, background_tasks: BackgroundTasks, db: Session = Depends(database.get_db)): + db_user = db.query(models.User).filter(models.User.username == user.username).first() + if db_user: + raise HTTPException(status_code=400, detail="Username already registered") + + hashed_password = auth_utils.get_password_hash(user.password) + db_user = models.User( + username=user.username, + email=user.email, + hashed_password=hashed_password, + is_active=user.is_active, + is_admin=user.is_admin + ) + db.add(db_user) + db.commit() + db.refresh(db_user) + + # Send email + background_tasks.add_task(email.send_welcome_email, user.email, user.username, user.password) + + return db_user + +@router.get("/", response_model=List[schemas.UserOut]) +async def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(database.get_db)): + users = db.query(models.User).offset(skip).limit(limit).all() + return users + +@router.put("/{user_id}", response_model=schemas.UserOut) +async def update_user(user_id: int, user_update: schemas.UserUpdate, background_tasks: BackgroundTasks, db: Session = Depends(database.get_db)): + db_user = db.query(models.User).filter(models.User.id == user_id).first() + if not db_user: + raise HTTPException(status_code=404, detail="User not found") + + if user_update.password: + db_user.hashed_password = auth_utils.get_password_hash(user_update.password) + # Send email on password change + background_tasks.add_task(email.send_welcome_email, db_user.email, db_user.username, user_update.password) + + if user_update.email: + db_user.email = user_update.email + if user_update.username: + db_user.username = user_update.username + if user_update.is_active is not None: + db_user.is_active = user_update.is_active + if user_update.is_admin is not None: + db_user.is_admin = user_update.is_admin + + db.commit() + db.refresh(db_user) + return db_user + +@router.post("/{user_id}/assign/{app_id}") +async def assign_app_to_user(user_id: int, app_id: int, db: Session = Depends(database.get_db)): + assignment = db.query(models.UserApplication).filter( + models.UserApplication.user_id == user_id, + models.UserApplication.application_id == app_id + ).first() + + if assignment: + return {"message": "Already assigned"} + + new_assignment = models.UserApplication(user_id=user_id, application_id=app_id) + db.add(new_assignment) + db.commit() + return {"message": "Assigned successfully"} diff --git a/backend/schemas.py b/backend/schemas.py new file mode 100644 index 0000000..5a07b90 --- /dev/null +++ b/backend/schemas.py @@ -0,0 +1,63 @@ +from pydantic import BaseModel, EmailStr +from typing import List, Optional +from datetime import datetime + +# User Schemas +class UserBase(BaseModel): + username: str + email: EmailStr + is_active: Optional[bool] = True + is_admin: Optional[bool] = False + +class UserCreate(UserBase): + password: str + +class UserUpdate(BaseModel): + username: Optional[str] = None + email: Optional[EmailStr] = None + password: Optional[str] = None + is_active: Optional[bool] = None + is_admin: Optional[bool] = None + +class UserOut(UserBase): + id: int + created_at: datetime + updated_at: datetime + + class Config: + orm_mode = True + +# Application Schemas +class ApplicationBase(BaseModel): + name: str + url: str + +class ApplicationCreate(ApplicationBase): + pass + +class ApplicationOut(ApplicationBase): + id: int + api_key: str + created_at: datetime + + class Config: + orm_mode = True + +# Token Schema +class Token(BaseModel): + access_token: str + token_type: str + +class TokenData(BaseModel): + username: Optional[str] = None + +# SSO Verification Schema +class SSOVerifyRequest(BaseModel): + username: str + password: str + api_key: str + +class SSOVerifyResponse(BaseModel): + authorized: bool + message: str + user: Optional[UserOut] = None diff --git a/backend/services/email.py b/backend/services/email.py new file mode 100644 index 0000000..264c06c --- /dev/null +++ b/backend/services/email.py @@ -0,0 +1,45 @@ +import aiosmtplib +from email.message import EmailMessage +import os + +SMTP_HOST = os.getenv("SMTP_ADDRESS", "smtp.gmail.com") +SMTP_PORT = int(os.getenv("SMTP_PORT", 587)) +SMTP_USER = os.getenv("SMTP_USER_NAME", "support@nabd-co.com") +SMTP_PASSWORD = os.getenv("SMTP_PASSWORD", "zwziglbpxyfogafc") + +async def send_email(to_email: str, subject: str, body: str): + message = EmailMessage() + message["From"] = SMTP_USER + message["To"] = to_email + message["Subject"] = subject + message.set_content(body) + + try: + await aiosmtplib.send( + message, + hostname=SMTP_HOST, + port=SMTP_PORT, + username=SMTP_USER, + password=SMTP_PASSWORD, + start_tls=True, + ) + print(f"Email sent to {to_email}") + except Exception as e: + print(f"Failed to send email to {to_email}: {e}") + +async def send_welcome_email(to_email: str, username: str, password: str): + subject = "Welcome to ASF SSO" + body = f""" + Hello {username}, + + Your account has been created/updated on the ASF SSO platform. + + Username: {username} + Password: {password} + + Please login to change your password if needed. + + Regards, + ASF Team + """ + await send_email(to_email, subject, body) diff --git a/caddy_config.txt b/caddy_config.txt new file mode 100644 index 0000000..d0c754a --- /dev/null +++ b/caddy_config.txt @@ -0,0 +1,7 @@ +# ------------------------- +# SSO Service Proxy +# ------------------------- +sso.nabd-co.com { + # Targets the container 'sso_service' on its internal port 8001 + reverse_proxy sso_service:8001 +} diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..06297c8 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Build and start the container +docker-compose up -d --build + +echo "SSO Service Deployed!" +echo "---------------------------------------------------" +echo "Please add the following to your Caddyfile:" +echo "" +echo "sso.nabd-co.com {" +echo " reverse_proxy sso_service:8001" +echo "}" +echo "" +echo "Then reload Caddy." +echo "---------------------------------------------------" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..43d7c3e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,25 @@ +version: '3.8' + +services: + sso: + build: . + container_name: sso_service + restart: always + ports: + - "8001:8001" + volumes: + - sso_data:/app/backend + environment: + - SMTP_ADDRESS=smtp.gmail.com + - SMTP_PORT=587 + - SMTP_USER_NAME=support@nabd-co.com + - SMTP_PASSWORD=zwziglbpxyfogafc + networks: + - sso_network + +networks: + sso_network: + + +volumes: + sso_data: diff --git a/docs/api_reference.md b/docs/api_reference.md new file mode 100644 index 0000000..f31b221 --- /dev/null +++ b/docs/api_reference.md @@ -0,0 +1,140 @@ +# ASF SSO API Reference + +This document details the API endpoints available in the ASF SSO service. + +## Base URL +`https://sso.nabd-co.com` (or `http://localhost:8001` for local dev) + +--- + +## 1. SSO Verification (External Apps) +This is the primary endpoint used by external applications to authenticate users. + +### `POST /verify` + +**Description**: Verifies a user's credentials and checks if they are authorized for the calling application. + +**Headers**: +- `Content-Type: application/json` + +**Request Body**: +```json +{ + "username": "jdoe", + "password": "secretpassword", + "api_key": "YOUR_APP_API_KEY" +} +``` + +**Response (Success - 200 OK)**: +```json +{ + "authorized": true, + "message": "Authorized", + "user": { + "username": "jdoe", + "email": "jdoe@example.com", + "is_active": true, + "is_admin": false, + "id": 5, + "created_at": "2026-01-25T12:00:00", + "updated_at": "2026-01-25T12:00:00" + } +} +``` + +**Response (Failure - 200 OK)**: +*Note: The API returns 200 OK even for auth failures, but with `authorized: false`.* +```json +{ + "authorized": false, + "message": "Invalid username or password" + // OR "User not authorized for this application" + // OR "User account is inactive" +} +``` + +**Example Usage (cURL)**: +```bash +curl -X POST https://sso.nabd-co.com/verify \ + -H "Content-Type: application/json" \ + -d '{ + "username": "testuser", + "password": "password123", + "api_key": "abc123xyz" + }' +``` + +--- + +## 2. Admin Authentication +These endpoints are for the Admin Dashboard. + +### `POST /token` + +**Description**: Login as an administrator to get an access token. + +**Request Body (Form Data)**: +- `username`: admin +- `password`: admin_password + +**Response**: +```json +{ + "access_token": "eyJhbGciOiJIUzI1Ni...", + "token_type": "bearer" +} +``` + +--- + +## 3. User Management (Admin Only) +**Requires Header**: `Authorization: Bearer ` + +### `GET /users/` +**Description**: List all users. + +### `POST /users/` +**Description**: Create a new user. +**Body**: +```json +{ + "username": "newuser", + "email": "user@example.com", + "password": "password123", + "is_admin": false +} +``` + +### `PUT /users/{user_id}` +**Description**: Update a user. +**Body**: +```json +{ + "email": "newemail@example.com", + "is_active": false +} +``` + +### `POST /users/{user_id}/assign/{app_id}` +**Description**: Assign a user to an application. + +--- + +## 4. Application Management (Admin Only) +**Requires Header**: `Authorization: Bearer ` + +### `GET /apps/` +**Description**: List all registered applications. + +### `POST /apps/` +**Description**: Register a new application. +**Body**: +```json +{ + "name": "OpenProject", + "url": "https://openproject.nabd-co.com" +} +``` +**Response**: +Returns the created app object, including the **`api_key`**. diff --git a/docs/user_guide.md b/docs/user_guide.md new file mode 100644 index 0000000..5105652 --- /dev/null +++ b/docs/user_guide.md @@ -0,0 +1,61 @@ +# ASF SSO Application - User Guide + +## Overview +The **ASF SSO (Single Sign-On)** application is a centralized authentication service designed to manage user access across multiple web applications within the ASF ecosystem. It provides a secure and unified way to handle user credentials and application permissions. + +## Key Features +- **Centralized User Management**: Create, update, and manage users from a single admin portal. +- **Application Management**: Register new applications and generate secure API keys. +- **Access Control**: Assign specific users to specific applications. +- **SSO Verification**: Secure API for external applications to verify user credentials and access rights. +- **Email Notifications**: Automatically sends welcome emails and password update notifications to users. +- **Modern UI**: A responsive, dark-themed dashboard for administrators. + +## Architecture +- **Backend**: Python FastAPI (High performance, easy to maintain). +- **Database**: SQLite (Self-contained, easy to backup). +- **Frontend**: Vanilla HTML/CSS/JavaScript (Lightweight, no build step required). +- **Deployment**: Docker & Docker Compose (Containerized for consistency). + +## Workflows + +### 1. Admin Login +The application is protected by an admin login. +- **URL**: `https://sso.nabd-co.com` +- **Default Credentials**: `admin` / `admin` (Change this immediately after first login). + +### 2. Managing Users +- **Create User**: + 1. Navigate to the **Users** tab. + 2. Click **Add User**. + 3. Enter Username, Email, and Password. + 4. Click **Save**. + 5. *Result*: The user is created, and a welcome email is sent to them. +- **Edit User**: Click **Edit** next to a user to update their details or reset their password. + +### 3. Managing Applications +- **Register Application**: + 1. Navigate to the **Applications** tab. + 2. Click **Add Application**. + 3. Enter the Application Name and URL. + 4. Click **Save**. + 5. *Result*: The application is listed, and a unique **API Key** is generated. + 6. **Important**: Copy the API Key. You will need to configure it in the external application. + +### 4. Assigning Access +Users cannot log in to an application unless they are explicitly assigned to it. +1. Go to the **Users** tab. +2. Click **Assign App** next to the user. +3. Select the target application from the dropdown. +4. Click **Assign**. + +## Integration Logic +When a user tries to log in to an external application (e.g., OpenProject): +1. The external app collects the username and password from the user. +2. The external app sends a secure request to the SSO `verify` endpoint. +3. The SSO service checks: + - Is the API Key valid? + - Are the username and password correct? + - Is the user assigned to this application? + - Is the user account active? +4. If all checks pass, SSO returns `Authorized`. Otherwise, it returns `Unauthorized`. diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..72892aa --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,150 @@ + + + + + + ASF SSO - Admin Portal + + + + +

+
+ +

Admin Login

+
+ + + +
+ +
+
+ + + + + + + + + + + + + + + + diff --git a/frontend/static/css/style.css b/frontend/static/css/style.css new file mode 100644 index 0000000..b178f2e --- /dev/null +++ b/frontend/static/css/style.css @@ -0,0 +1,152 @@ +:root { + --primary-color: #007bff; + --secondary-color: #6c757d; + --background-color: #0f172a; /* Dark Blue */ + --surface-color: #1e293b; /* Lighter Dark Blue */ + --text-color: #f8fafc; + --text-muted: #94a3b8; + --accent-color: #38bdf8; + --glass-bg: rgba(30, 41, 59, 0.7); + --glass-border: rgba(255, 255, 255, 0.1); +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} + +body { + background-color: var(--background-color); + color: var(--text-color); + min-height: 100vh; + display: flex; + flex-direction: column; +} + +/* Utilities */ +.hidden { display: none !important; } +.flex { display: flex; } +.flex-col { flex-direction: column; } +.items-center { align-items: center; } +.justify-center { justify-content: center; } +.justify-between { justify-content: space-between; } +.gap-4 { gap: 1rem; } +.p-4 { padding: 1rem; } +.p-8 { padding: 2rem; } +.m-4 { margin: 1rem; } +.mt-4 { margin-top: 1rem; } +.w-full { width: 100%; } +.text-center { text-align: center; } +.text-xl { font-size: 1.25rem; font-weight: bold; } +.text-2xl { font-size: 1.5rem; font-weight: bold; } +.text-accent { color: var(--accent-color); } + +/* Glassmorphism Card */ +.card { + background: var(--glass-bg); + backdrop-filter: blur(10px); + border: 1px solid var(--glass-border); + border-radius: 1rem; + padding: 2rem; + box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); +} + +/* Buttons */ +.btn { + padding: 0.75rem 1.5rem; + border-radius: 0.5rem; + border: none; + cursor: pointer; + font-weight: 600; + transition: all 0.2s; +} + +.btn-primary { + background-color: var(--primary-color); + color: white; +} + +.btn-primary:hover { + background-color: #0056b3; +} + +.btn-secondary { + background-color: var(--surface-color); + color: var(--text-color); + border: 1px solid var(--glass-border); +} + +.btn-secondary:hover { + background-color: #334155; +} + +/* Inputs */ +input, select { + width: 100%; + padding: 0.75rem; + margin-bottom: 1rem; + border-radius: 0.5rem; + border: 1px solid var(--glass-border); + background-color: rgba(0, 0, 0, 0.2); + color: white; + outline: none; +} + +input:focus { + border-color: var(--accent-color); +} + +/* Layout */ +header { + background: var(--surface-color); + border-bottom: 1px solid var(--glass-border); + padding: 1rem 2rem; +} + +.logo { + height: 40px; + margin-right: 1rem; +} + +/* Tables */ +table { + width: 100%; + border-collapse: collapse; + margin-top: 1rem; +} + +th, td { + padding: 1rem; + text-align: left; + border-bottom: 1px solid var(--glass-border); +} + +th { + color: var(--text-muted); + font-weight: 600; +} + +tr:hover { + background-color: rgba(255, 255, 255, 0.05); +} + +/* Modal */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 100; +} + +.modal { + width: 90%; + max-width: 500px; +} diff --git a/frontend/static/img/logo.png b/frontend/static/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c445709762d0b4655ac928ef0982a009b509f2fa GIT binary patch literal 84730 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◊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

|O^tVI$vV99hw=9W2Y=ZMqy?PTZ9 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 cWq+9tI%rboFyt=akR{0HjRpbN~PV literal 0 HcmV?d00001 diff --git a/frontend/static/js/app.js b/frontend/static/js/app.js new file mode 100644 index 0000000..6e950c3 --- /dev/null +++ b/frontend/static/js/app.js @@ -0,0 +1,257 @@ +const API_URL = ""; // Relative path since served by same origin + +// State +let token = localStorage.getItem("token"); +let currentUser = null; + +// DOM Elements +const loginPage = document.getElementById("login-page"); +const dashboardLayout = document.getElementById("dashboard-layout"); +const loginForm = document.getElementById("login-form"); +const loginError = document.getElementById("login-error"); +const logoutBtn = document.getElementById("logout-btn"); +const usersSection = document.getElementById("users-section"); +const appsSection = document.getElementById("apps-section"); +const usersTableBody = document.querySelector("#users-table tbody"); +const appsTableBody = document.querySelector("#apps-table tbody"); + +// Init +function init() { + if (token) { + showDashboard(); + } else { + showLogin(); + } +} + +// Navigation +function showLogin() { + loginPage.classList.remove("hidden"); + dashboardLayout.classList.add("hidden"); +} + +function showDashboard() { + loginPage.classList.add("hidden"); + dashboardLayout.classList.remove("hidden"); + loadUsers(); +} + +function showSection(section) { + if (section === 'users') { + usersSection.classList.remove("hidden"); + appsSection.classList.add("hidden"); + loadUsers(); + } else { + usersSection.classList.add("hidden"); + appsSection.classList.remove("hidden"); + loadApps(); + } +} + +// Auth +loginForm.addEventListener("submit", async (e) => { + e.preventDefault(); + const username = document.getElementById("username").value; + const password = document.getElementById("password").value; + + try { + const formData = new FormData(); + formData.append("username", username); + formData.append("password", password); + + const res = await fetch(`${API_URL}/token`, { + method: "POST", + body: formData + }); + + if (!res.ok) throw new Error("Invalid credentials"); + + const data = await res.json(); + token = data.access_token; + localStorage.setItem("token", token); + loginError.classList.add("hidden"); + showDashboard(); + } catch (err) { + loginError.textContent = err.message; + loginError.classList.remove("hidden"); + } +}); + +logoutBtn.addEventListener("click", () => { + token = null; + localStorage.removeItem("token"); + showLogin(); +}); + +// API Helpers +async function authFetch(url, options = {}) { + const headers = { + ...options.headers, + "Authorization": `Bearer ${token}` + }; + + const res = await fetch(url, { ...options, headers }); + if (res.status === 401) { + logoutBtn.click(); + throw new Error("Unauthorized"); + } + return res; +} + +// Users +async function loadUsers() { + const res = await authFetch(`${API_URL}/users/`); + const users = await res.json(); + usersTableBody.innerHTML = users.map(user => ` + + ${user.id} + ${user.username} + ${user.email} + ${user.is_admin ? "Yes" : "No"} + ${user.is_active ? "Yes" : "No"} + + + + + + `).join(""); +} + +// Apps +async function loadApps() { + const res = await authFetch(`${API_URL}/apps/`); + const apps = await res.json(); + appsTableBody.innerHTML = apps.map(app => ` + + ${app.id} + ${app.name} + ${app.url} + ${app.api_key} + + `).join(""); +} + +// Modals +function openModal(id) { + document.getElementById(id).classList.remove("hidden"); +} + +function closeModal(id) { + document.getElementById(id).classList.add("hidden"); +} + +// User Form +const userForm = document.getElementById("user-form"); +userForm.addEventListener("submit", async (e) => { + e.preventDefault(); + const id = document.getElementById("user-id").value; + const username = document.getElementById("user-username").value; + const email = document.getElementById("user-email").value; + const password = document.getElementById("user-password").value; + const isAdmin = document.getElementById("user-is-admin").checked; + const isActive = document.getElementById("user-is-active").checked; + + const data = { username, email, is_admin: isAdmin, is_active: isActive }; + if (password) data.password = password; + + try { + let res; + if (id) { + res = await authFetch(`${API_URL}/users/${id}`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data) + }); + } else { + if (!password) return alert("Password required for new user"); + res = await authFetch(`${API_URL}/users/`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(data) + }); + } + + if (!res.ok) { + const err = await res.json(); + throw new Error(err.detail); + } + + closeModal("user-modal"); + loadUsers(); + } catch (err) { + alert(err.message); + } +}); + +window.editUser = (user) => { + document.getElementById("user-id").value = user.id; + document.getElementById("user-username").value = user.username; + document.getElementById("user-email").value = user.email; + document.getElementById("user-password").value = ""; + document.getElementById("user-is-admin").checked = user.is_admin; + document.getElementById("user-is-active").checked = user.is_active; + openModal("user-modal"); +}; + +// App Form +const appForm = document.getElementById("app-form"); +appForm.addEventListener("submit", async (e) => { + e.preventDefault(); + const name = document.getElementById("app-name").value; + const url = document.getElementById("app-url").value; + + try { + const res = await authFetch(`${API_URL}/apps/`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ name, url }) + }); + + if (!res.ok) { + const err = await res.json(); + throw new Error(err.detail); + } + + closeModal("app-modal"); + loadApps(); + } catch (err) { + alert(err.message); + } +}); + +// Assign App +window.assignAppModal = async (userId) => { + document.getElementById("assign-user-id").value = userId; + + // Load apps for select + const res = await authFetch(`${API_URL}/apps/`); + const apps = await res.json(); + const select = document.getElementById("assign-app-select"); + select.innerHTML = '' + + apps.map(app => ``).join(""); + + openModal("assign-modal"); +}; + +const assignForm = document.getElementById("assign-form"); +assignForm.addEventListener("submit", async (e) => { + e.preventDefault(); + const userId = document.getElementById("assign-user-id").value; + const appId = document.getElementById("assign-app-select").value; + + try { + const res = await authFetch(`${API_URL}/users/${userId}/assign/${appId}`, { + method: "POST" + }); + + if (!res.ok) throw new Error("Failed to assign"); + + closeModal("assign-modal"); + alert("Assigned successfully"); + } catch (err) { + alert(err.message); + } +}); + +// Start +init(); diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3d0567b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +fastapi +uvicorn +sqlalchemy +pydantic +passlib[bcrypt] +python-multipart +python-jose[cryptography] +aiosmtplib +jinja2