Ho un chatserver python che utilizza connessioni web twisted e autobahn per la connessione.autenticazione open server chaserver websocket twistato
factory = MessageServerFactory("ws://localhost:9000", debug=debug, debugCodePaths=debug)
factory.protocol = MessageServerProtocol
factory.setProtocolOptions(allowHixie76=True)
listenWS(factory)
questo è il 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
un html/client JS indipendente può connettersi e inviare messaggi di chat. ma voglio implementare un'autenticazione id aperta (eseguita dal server), prima di aprire il websocket.
questa è la funzione onload:
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);
}
}
come io sono nuovo a Python/contorto non so come fare questo ed esempi mostrano per lo più solo chat websocket senza autenticazione.
come posso implementare correttamente openid? in quanto richiede anche il reindirizzamento, che interromperebbe la connessione ws.
Non aprire ws fino a dopo il reindirizzamento ... – carter