حالت Login Required در GraphQL با FastAPI و JWT

  • مدرس : علی بیگدلی
  • تاریخ انتشار: 1404/06/24
  • تعداد بازدید: 3

حالت 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 و مدیریت خطاها هستیم.

ثبت دیدگاه


نکته: آدرس ایمیل شما منتشر نخواهد شد

دیدگاه کاربران (0)


هیچ دیدگاهی ثبت نشده است. می‌توانید اولین نفر باشید.