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

问题描述 投票:3回答:1

我使用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请求标头中的任何内容)并将其用于WebSocket消息处理。

我如何确保请求与来自WebSocket连接的请求来自同一浏览器会话?

注意

由于我对HTTP和WebSocket的了解不多,所以我希望在这里尽可能详细地回答。

python http websocket bottle gevent
1个回答
0
投票

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

Browser session有点抽象,因为HTTP没有sessions的概念。 HTTP和RESTful API设计为stateless,但是有选项。

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

[bottle-oauthlib似乎是一个使用OAuth2 / OpenID Connect验证最终用户的库。

另一种选择是使用cookies识别“浏览器会话”,但这取决于服务器端某处的state,并且难以在云原生平台(例如)上实现。偏爱stateless工作负载的Kubernetes。

© www.soinside.com 2019 - 2024. All rights reserved.