حالت Login Required در GraphQL با FastAPI و JWT
حالت "Login Required" به این معناست که برخی Query و Mutationها تنها زمانی قابل دسترسی هستند که کاربر وارد شده و توکن JWT معتبر داشته باشد. در ساختار پروژهای که از GraphQLRouter
با context_getter
استفاده میکنیم، Session دیتابیس و اطلاعات کاربر میتوانند از طریق context به Resolverها منتقل شوند.
۱. تعریف Dependency برای کاربر جاری
# graphql/context.py
from utils.jwt import decode_access_token
from models.users import User
def get_current_user(authorization: str, db) -> User:
if not authorization:
raise Exception("Unauthorized: Missing Authorization header")
token = authorization.replace("Bearer ", "")
payload = decode_access_token(token)
user = db.query(User).filter(User.id == payload.get("user_id")).first()
if not user:
raise Exception("Unauthorized: User not found")
return user
۲. استفاده از Login Required در Resolver با context
# graphql/tasks.py
import strawberry
from graphql.context import get_current_user
from graphql.types import TaskType
@strawberry.type
class TaskQuery:
@strawberry.field
def my_tasks(self, info) -> list[TaskType]:
# db و هدر Authorization از context گرفته میشوند
db = info.context["db"]
auth_header = info.context["request"].headers.get("authorization")
# بررسی ورود کاربر
current_user = get_current_user(auth_header, db)
tasks = db.query(TaskModel).filter(TaskModel.user_id == current_user.id).all()
return [
TaskType(
id=task.id,
title=task.title,
completed=task.completed,
user_id=task.user_id,
created_at=str(task.created_at),
updated_at=str(task.updated_at)
) for task in tasks
]
۳. نکات مهم
- Session دیتابیس (db) از
context
گرفته میشود و دیگر نیازی به ایجاد Session جدید در Resolver نیست. - توکن JWT از هدر Authorization استخراج و با
get_current_user
بررسی میشود. - تمام Query و Mutationهایی که نیاز به ورود دارند میتوانند همین الگو را استفاده کنند.
- مزیت: مدیریت یکپارچه Login Required، استفاده مجدد و کنترل بهتر Sessionها.
با این روش، امنیت و مدیریت دسترسی کاربران در Resolverها ساده و یکپارچه میشود و آماده ترکیب با Custom Exception Handler و مدیریت خطاها هستیم.