<p>我的解决方案是在客户端连接到服务器后检查HTTP头,如果客户端没有有效的API密钥,则关闭连接。在</p>
<pre><code>MY_API_KEY = u'12345'
class MyServerProtocol(WebSocketServerProtocol):
def onConnect(self, request):
print("Client connecting: {}".format(request.peer))
def onOpen(self):
# Check API Key
if 'my-api-key' not in self.http_headers or\
self.http_headers['my-api-key'] != MY_API_KEY:
# Disconnect the client
print('Missing/Invalid Key')
self.sendClose( 4000, u'Missing/Invalid Key')
# Register client
self.factory.register(self)
</code></pre>
<p>我发现,如果我关闭onConnect中的连接,我会得到一个错误消息:我无法关闭尚未连接的连接。上面的解决方案在客户端关闭得很干净,但是在服务器端的行为却很奇怪。日志输出是</p>
^{pr2}$
<p>服务器端关闭消息为“无”的原因是服务器关闭了连接而客户端没有发回吗?有更好的方法吗?在</p>
<p><strong>更新:</strong>
我接受了亨利·希思的答案,因为它似乎是官方支持的解决方案,尽管它并不能彻底地关闭连接。使用<code>autobahn.websocket.types.ConnectionDeny</code>,解决方案变成</p>
<pre><code>from autobahn.websocket.types import ConnectionDeny
MY_API_KEY = u'12345'
class MyServerProtocol(WebSocketServerProtocol):
def onConnect(self, request):
print("Client connecting: {}".format(request.peer))
# Check API Key
if 'my-api-key' not in request.headers or\
request.headers['my-api-key'] != MY_API_KEY:
# Disconnect the client
print('Missing/Invalid Key')
raise ConnectionDeny( 4000, u'Missing/Invalid Key')
def onOpen(self):
# Register client
self.factory.register(self)
</code></pre>
<p>注意,在onConnect中,HTTP头可以通过请求.headers而在onOpen中,它们可以通过self.http_头文件. 在</p>