2013-05-14 14 views
10

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.

+1

Non aprire ws fino a dopo il reindirizzamento ... – carter

risposta

1

Non è possibile aprire ws prima del reindirizzamento. Aprilo dopo e il tuo codice dovrebbe funzionare.

Buona fortuna.

A proposito, Google lo fa nella sua homepage.