ich habe einen python chatserver der twisted und autobahn websockets für verbindung benutzt.twisted websocket chatserver openid authentication
factory = MessageServerFactory("ws://localhost:9000", debug=debug, debugCodePaths=debug)
factory.protocol = MessageServerProtocol
factory.setProtocolOptions(allowHixie76=True)
listenWS(factory)
dies ist der Server
import logging
from autobahn.websocket import WebSocketServerFactory, WebSocketServerProtocol
from DatabaseConnector import DbConnector
from LoginManager import LoginManager
from MessageTypes import MessageParser
class MessageServerProtocol(WebSocketServerProtocol):
def onOpen(self):
self.factory.register(self)
def onMessage(self, msg, binary):
if not binary:
self.factory.processMessage(self, msg)
def connectionLost(self, reason):
WebSocketServerProtocol.connectionLost(self, reason)
self.factory.unregister(self)
class MessageServerFactory(WebSocketServerFactory):
logging.basicConfig(filename='log/dastan.log',format='%(levelname)s:%(message)s',level=logging.WARNING)
def __init__(self, url, debug=False, debugCodePaths=False):
WebSocketServerFactory.__init__(self, url, debug=debug, debugCodePaths=debugCodePaths)
self.clients = {}
self.connector = DbConnector()
self.messages = MessageParser()
self.manager = LoginManager()
def register(self, client):
print "%s connected" % client.peerstr
def unregister(self, client):
if self.clients.has_key(client):
self.processLogout(client)
print "%s disconnected" % client.peerstr
def processMessage(self, client, msg):
try:
msg = self.messages.parseMessage(msg)
action = msg['Type']
except ValueError, e:
logging.warning("[Parse]:%s", e.message)
client.sendMessage(self.messages.createErrorMessage("could not parse your message"))
return
if action == "ChatMessage":
self.processChatMessage(client, msg)
# elif action == "Login":
# self.processLogin(client, msg)
# elif action == "Logout":
# self.processLogout(client)
elif action == "OpenId":
self.manager.processLogin(client,msg)
def processChatMessage(self, client, msg):
if not self.clients.has_key(client):
client.sendMessage(self.messages.createErrorMessage('Not authorized'))
return
if not msg['Message']:
client.sendMessage(self.messages.createErrorMessage('Invalid Message'))
return
if not msg['Recipient']:
client.sendMessage(self.messages.createErrorMessage('Invalid Recipient'))
return
if msg['Recipient'] in self.clients.values():
for c in self.clients:
if self.clients[msg['Recipient']]:
c.sendMessage(self.messages.chatMessage(msg['Sender'], msg['Message']))
print "sent message from %s to %s: '%s' .." % (msg['Sender'], msg['Recipient'], msg['Message'])
else:
client.sendMessage(self.messages.createErrorMessage('User not registered'))
def checkSender(self, user, client):
if user in self.clients.values() and self.clients[client] == user:
return
else:
self.clients[client] = user
eine unabhängige html/js Client Chat-Nachrichten verbinden und senden. aber ich möchte eine offene ID-Authentifizierung implementieren (durchgeführt von dem Server), bevor Sie den Websocket öffnen.
ist dies die onload-Funktion:
var wsuri = "ws://192.168.0.12:9000";
if ("WebSocket" in window) {
sock = new WebSocket(wsuri);
} else if ("MozWebSocket" in window) {
sock = new MozWebSocket(wsuri);
} else {
log("Browser does not support WebSocket!");
window.location = "http://autobahn.ws/unsupportedbrowser";
}
if (sock) {
sock.onopen = function() {
log("Connected to " + wsuri);
}
sock.onclose = function (e) {
log("Connection closed (wasClean = " + e.wasClean + ", code = " + e.code + ", reason = '" + e.reason + "')");
sock = null;
}
sock.onmessage = function (e) {
receive(e.data);
}
}
, wie ich zu Python neu bin/verdreht ich weiß nicht, wie dies zu tun und Beispiele zeigen meist nur websocket Chatroom ohne Authentifizierung.
Wie kann ich openid richtig implementieren? da es auch eine Umleitung erfordert, die die ws-Verbindung unterbrechen würde.
Öffnen Sie die WS erst nach der Weiterleitung ... – carter