2013-05-14 40 views
10

我有一個python聊天服務器,使用扭曲和高速公路websockets進行連接。扭曲websocket聊天服務器openid認證

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之前實現一個開放式身份驗證(由服務器執行)。

這是在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); 
    } 
} 

,因爲我是新來的Python /扭曲我不知道如何做到這一點,主要的例子只顯示WebSocket的聊天室沒有認證。

我該如何正確實施openid?因爲它也需要重定向,這會破壞ws連接。

+1

直到重定向後纔打開ws ... – carter 2013-10-25 15:01:07

回答

1

在重定向之前,您無法打開ws。打開它,然後你的代碼應該工作。

祝你好運。

By The Way,google在主頁上顯示它。