我使用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的了解不多,所以我希望在这里尽可能详细地回答。
如何确保请求来自与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。