|
1 | 1 | import logging |
| 2 | +from datetime import timedelta, timezone |
| 3 | +from flask_jwt_extended import JWTManager |
2 | 4 | from datetime import datetime |
3 | 5 | from flask import Flask, render_template |
4 | 6 | from graphene import Schema |
5 | 7 | from graphql.utils import schema_printer |
| 8 | +from src.utils.constants import JWT_SECRET_KEY |
6 | 9 | from src.database import db_session, init_db |
7 | 10 | from src.database import Base as db |
8 | 11 | from src.database import db_url, db_user, db_password, db_name, db_host, db_port |
9 | 12 | from flask_migrate import Migrate |
10 | 13 | from src.schema import Query, Mutation |
11 | 14 | from flasgger import Swagger |
12 | 15 | from flask_graphql import GraphQLView |
| 16 | +from src.models.token_blacklist import TokenBlocklist |
| 17 | + |
13 | 18 |
|
14 | 19 | # Set up logging at module level |
15 | 20 | logging.basicConfig(format="%(asctime)s %(levelname)-8s %(message)s", level=logging.INFO, datefmt="%Y-%m-%d %H:%M:%S") |
@@ -51,6 +56,17 @@ def create_app(run_migrations=False): |
51 | 56 | schema = Schema(query=Query, mutation=Mutation) |
52 | 57 | swagger = Swagger(app) |
53 | 58 |
|
| 59 | + app.config["JWT_SECRET_KEY"] = JWT_SECRET_KEY |
| 60 | + app.config["JWT_ACCESS_TOKEN_EXPIRES"] = timedelta(hours=1) |
| 61 | + app.config["JWT_REFRESH_TOKEN_EXPIRES"] = timedelta(days=30) |
| 62 | + |
| 63 | + jwt = JWTManager(app) |
| 64 | + |
| 65 | + @jwt.token_in_blocklist_loader |
| 66 | + def check_if_token_revoked(jwt_header, jwt_payload: dict) -> bool: |
| 67 | + jti = jwt_payload["jti"] |
| 68 | + return db_session.query(TokenBlocklist.id).filter_by(jti=jti).scalar() is not None |
| 69 | + |
54 | 70 | # Configure routes |
55 | 71 | logger.info("Configuring routes") |
56 | 72 |
|
@@ -158,6 +174,13 @@ def scrape_classes(): |
158 | 174 | except Exception as e: |
159 | 175 | logging.error(f"Error in scrape_classes: {e}") |
160 | 176 |
|
| 177 | + @scheduler.task("interval", id="cleanup_expired_tokens", hours=24) |
| 178 | + def cleanup_expired_tokens(): |
| 179 | + logger.info("Deleting expired tokens...") |
| 180 | + now = datetime.now(timezone.utc) |
| 181 | + db_session.query(TokenBlocklist).filter(TokenBlocklist.expires_at < now).delete() |
| 182 | + db_session.commit() |
| 183 | + |
161 | 184 | # Update hourly average capacity every hour |
162 | 185 | @scheduler.task("cron", id="update_capacity", hour="*") |
163 | 186 | def scheduled_job(): |
|
0 commit comments