احراز هویت In-Band در WebSocket

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

In-Band Authentication یکی از بهترین روش‌ها برای احراز هویت در WebSocket است. در این روش، احراز هویت پس از برقراری اتصال WebSocket انجام می‌شود و پیام‌های ابتدایی شامل اطلاعات کاربری یا توکن می‌شوند. این روش به ویژه برای سیستم‌هایی که نیاز به تأیید اعتبار قبل از اجازه به ارسال داده‌ها دارند مناسب است.

مزایای In-Band Authentication

  • اطلاعات حساس در URL یا هدر ارسال نمی‌شود، بنابراین امنیت بالاتر است.
  • می‌توان بعد از اتصال چندین مرحله احراز هویت را انجام داد (مثلاً اعتبارسنجی دو مرحله‌ای).
  • امکان مدیریت زمان‌بندی و محدودیت دسترسی برای کاربران فراهم می‌شود.

نمونه سرور FastAPI با In-Band Authentication

from fastapi import FastAPI, WebSocket, WebSocketDisconnect

VALID_TOKENS = {"token123": "user1", "token456": "user2"}

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        # پیام اول باید شامل توکن باشد
        token_message = await websocket.receive_text()
        token = token_message.strip()
        if token not in VALID_TOKENS:
            await websocket.send_text("Invalid token, closing connection.")
            await websocket.close(code=1008)
            return
        username = VALID_TOKENS[token]
        await websocket.send_text(f"Welcome {username}!")
        
        # ادامه دریافت و ارسال پیام‌ها
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"{username} sent: {data}")
    except WebSocketDisconnect:
        print("Client disconnected")

نمونه کلاینت پایتون با In-Band Authentication

import asyncio
import websockets

TOKEN = "token123"
uri = "ws://127.0.0.1:8000/ws"

async def websocket_client():
    async with websockets.connect(uri) as websocket:
        # ارسال توکن به سرور پس از اتصال
        await websocket.send(TOKEN)
        welcome = await websocket.recv()
        print(f"Server: {welcome}")
        
        while True:
            message = input("Enter your message: ")
            await websocket.send(message)
            response = await websocket.recv()
            print(f"Server response: {response}")

asyncio.run(websocket_client())

توضیح:

  • در این روش، کلاینت ابتدا یک پیام شامل توکن یا اطلاعات احراز هویت به سرور ارسال می‌کند.
  • سرور توکن دریافتی را بررسی کرده و در صورت معتبر بودن، اتصال را ادامه می‌دهد.
  • در صورت نامعتبر بودن توکن، سرور پیام خطا ارسال کرده و اتصال را می‌بندد.
  • این روش امکان اعمال سیاست‌های امنیتی بیشتر مانند انقضای توکن و مدیریت چندمرحله‌ای را فراهم می‌کند.

ثبت دیدگاه


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

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


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