Skip to content

FastAPI-Login在WebSocket使用依賴注入

LOG-00841 MINPython

在WebSocket路由使用依賴注入做權限控制結果FastAPI報錯。


最近把幾個FastAPI HTTP改成WebSocket連線,測試運作正常,但是加上權限控制相關設定後就掛了😞

一般是這樣用的:

python
manager = LoginManager(
    secret= 'secret_key',
    token_url='/auth/token',
    use_cookie=True
)

@router.get('/example')
async def example(
    user = Depends(manager)
):

但是改成WebSocket為啥就不行了? 因為FastAPI-Login的LoginManager在self.__call__的設計是需要Request物件來讀取cookie或header,但WebSocket handler沒有Request物件,所以嘗試依賴注入時就發生錯誤了。

怎麼辦?沒有Request,就生一個出來給它吧😬

python
from fastapi import Request, WebSocket

async def websocket_user(websocket: WebSocket):
    fake_request = Request({
        'type': 'http',
        'headers': websocket.headers.raw
    })
    return await LoginManager.__call__(fake_request)

做一個假的Request把websocket.headers傳給LoginManager,就能在WebSocket做依賴注入啦:

python
from fastapi import WebSocket

@router.websocket('/example')
async def example(
    websocket: WebSocket,
    user = Depends(websocket_user)
):
    await websocket.accept()
    print(user)