2013-05-14 13 views
10

私は接続にツイストとオートバンのウェブソケットを使用するpythonチャットサーバーを持っています。twisted websocket chatserver openid authentication

factory = MessageServerFactory("ws://localhost:9000", debug=debug, debugCodePaths=debug) 
factory.protocol = MessageServerProtocol 
factory.setProtocolOptions(allowHixie76=True) 
listenWS(factory) 

このサーバである

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 

独立したhtml/jsのクライアントは、チャットメッセージを接続し、送信することができます。 WebSocketを開く前に、オープンID認証(サーバーで実行)を実装したいと考えています。

これは、オンロード機能である:

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); 
    } 
} 

私はツイストのpython /への新たなんだと私はこれを行うと例はほとんど真偽なしのみのWebSocketチャットルームを表示する方法がわかりません。

openidを正しく実装するにはどうすればよいですか?これはリダイレクトを必要とするため、ws接続が切断されます。

+1

リダイレクト後までwsを開かないでください... – carter

答えて

1

リダイレクトする前にwsを開くことはできません。それを開いて、あなたのコードが動作するはずです。

幸運。

ザウェイでは、googleがホームページでこれを行います。