یکی از روشهای امن احراز هویت در WebSocket استفاده از هدرهای سفارشی یا Subprotocols است. در این روش کلاینت هنگام اتصال، هدرهای احراز هویت یا یک پروتکل خاص را مشخص میکند و سرور قبل از پذیرش اتصال آنها را بررسی میکند.
نمونه سرور FastAPI با بررسی هدر Authorization
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Header
from fastapi.responses import JSONResponse
app = FastAPI()
VALID_TOKEN = "mysecuretoken"
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket, authorization: str = Header(None)):
# بررسی هدر Authorization
if authorization != f"Bearer {VALID_TOKEN}":
await websocket.close(code=1008)
return
await websocket.accept()
try:
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Server received: {data}")
except WebSocketDisconnect:
print("Client disconnected")
نمونه کلاینت پایتون با ارسال هدر Authorization
import asyncio
import websockets
TOKEN = "mysecuretoken"
uri = "ws://127.0.0.1:8000/ws"
async def websocket_client():
async with websockets.connect(uri, extra_headers={"Authorization": f"Bearer {TOKEN}"}) as websocket:
print("Connected to server with Authorization header!")
while True:
message = input("Enter your message: ")
await websocket.send(message)
response = await websocket.recv()
print(f"Server response: {response}")
asyncio.run(websocket_client())
استفاده از Subprotocol برای احراز هویت
WebSocket امکان تعریف Subprotocol دارد. کلاینت میتواند هنگام اتصال یک پروتکل مشخص (مثلاً token-auth) انتخاب کند و سرور قبل از پذیرش اتصال آن را بررسی کند.
# کلاینت با Subprotocol
async with websockets.connect(uri, subprotocols=["token-auth"]) as websocket:
...
توضیح:
- هدرهای Authorization یا Subprotocol میتوانند برای ارسال توکن یا کلیدهای امنیتی استفاده شوند.
- سرور با بررسی هدرها یا Subprotocol تصمیم میگیرد که اتصال را بپذیرد یا نه.
- این روش نسبت به query parameter امنتر است زیرا اطلاعات حساس در URL ظاهر نمیشود.