Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

twisted websocket chatserver openid authentication

Tags:

i have a python chatserver that uses twisted and autobahn websockets for connection.

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

this is the 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

an independent html/js client can connect and send chat messages. but i want to implement an open id authentication (performed by the server), before opening the websocket.

this is the onload function:

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

as i'm new to python/twisted i don't know how to do this and examples mostly show only websocket chatroom without authentification.

how can i implement openid properly? as it also requires redirection, which would break the ws connection.


Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!