2013-05-14 9 views
10

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.

+1

Öffnen Sie die WS erst nach der Weiterleitung ... – carter

Antwort

1

Sie können die ws vor der Umleitung nicht öffnen. Öffnen Sie es nach und dann sollte Ihr Code funktionieren.

Viel Glück.

Übrigens tut Google dies auf seiner Homepage.