Bottle-WebSocket: 如何确保 HTTP 请求与 ws 连接来自同一个 session?

Bottle-WebSocket: How to ensure an HTTP request is from the same session as ws connection?

我使用 Python Bottle 框架构建了一个 Web 应用程序。 我使用 bottle-websocket 插件与客户端进行 WebSocket 通信。 这是我的代码的一部分。

from bottle import Bottle, request, run
from bottle.ext.websocket import GeventWebSocketServer, websocket

class MyHandler():
    ...

class MyServer(Bottle):

    ...

    def _serve_websocket(self, ws):
        handler = MyHandler()
        some_data = request.cookies.get('some_key') # READ SOME DATA FROM HTTP REQUEST

        while True:
            msg = ws.receive()
            handler.do_sth_on(msg, some_data) # USE THE DATA FROM HTTP REQUEST
            ws.send(msg)

        del(handler)

if __name__ == '__main__':
    run(app=MyServer(), server=GeventWebSocketServer, host=HOST, port=PORT)

如代码所示,我需要从浏览器读取一些数据(cookie 或 HTTP 请求中的任何内容 headers)并将其用于 WebSocket 消息处理。

如何确保请求与 WebSocket 连接来自同一浏览器 session?

NOTE

As I do not have much knowledge of HTTP and WebSocket, I'd love to here detailed answere as much as possible.

How can I ensure the request is from the same browser session as the one where WebSocket connection comes?

浏览器session有点抽象,因为HTTP没有sessions的概念。 HTTP 和 RESTful API 被设计为无状态,但也有选项。

通常,您通常想知道的是请求来自哪个用户。这通常通过 authentication 来解决,例如通过使用 OpenID Connect 并让用户在 Authorization: header 中发送他的 JWT-token,这适用于所有 HTTP 请求,包括设置 Websocket 连接时。

bottle-oauthlib 似乎是一个使用 OAuth2 / OpenID Connect 进行身份验证 end-users 的库。

另一种选择是使用 cookies 来识别 "browser session" 但这取决于服务器端某处的 state 和更难在云原生平台上实​​现,例如更喜欢 无状态 工作负载的 Kubernetes。