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。
我使用 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。