احراز هویت مبتنی بر Session در Websocket

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

در مدل Session-Based، کاربر ابتدا با HTTP لاگین می‌کند و یک session در سرور ایجاد می‌شود. سپس کلاینت می‌تواند WebSocket را باز کند و session برای احراز هویت استفاده می‌شود.

نمونه سرور FastAPI با session و WebSocket

from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Request, Response, Cookie
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
import uuid

app = FastAPI()

# مدیریت session ساده با یک دیکشنری
sessions = {}

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.post("/login")
async def login(response: Response, username: str, password: str):
    # بررسی کاربری (در مثال ساده بدون DB)
    if username == "user" and password == "pass":
        session_id = str(uuid.uuid4())
        sessions[session_id] = {"username": username}
        response.set_cookie(key="session_id", value=session_id)
        return {"message": "Login successful"}
    return JSONResponse(status_code=401, content={"message": "Invalid credentials"})

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket, session_id: str = Cookie(None)):
    if session_id is None or session_id not in sessions:
        await websocket.close(code=1008)
        return
    await websocket.accept()
    user = sessions[session_id]
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"{user['username']} sent: {data}")
    except WebSocketDisconnect:
        print("Client disconnected")

نمونه کلاینت پایتون با استفاده از session

import asyncio
import websockets

# فرض کنید مرورگر یا کلاینت session_id را دارد
SESSION_ID = "SESSION_ID_FROM_LOGIN"
uri = "ws://127.0.0.1:8000/ws"

async def websocket_client():
    async with websockets.connect(uri, extra_headers={"Cookie": f"session_id={SESSION_ID}"}) as websocket:
        print("Connected to server using session!")
        while True:
            message = input("Enter your message: ")
            await websocket.send(message)
            response = await websocket.recv()
            print(f"Server response: {response}")

asyncio.run(websocket_client())

توضیح:

  • کاربر ابتدا با مسیر /login لاگین می‌کند و سرور یک session_id ایجاد و در کوکی ذخیره می‌کند.
  • کلاینت هنگام اتصال WebSocket، session_id را در هدر Cookie ارسال می‌کند.
  • سرور با بررسی session_id معتبر بودن اتصال را تایید می‌کند و ارتباط برقرار می‌شود.
  • در صورت نامعتبر بودن session، اتصال WebSocket با کد 1008 بسته می‌شود.

ثبت دیدگاه


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

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


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