twisted websocket chatserver openid authentication
Asked Answered
H

1

10

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.

Horne answered 14/5, 2013 at 9:17 Comment(1)
Don't open the ws until after the redirection...Sheriesherif
B
1

You cannot open the ws before the redirection. Open it after and then your code should work.

Good luck.

By The Way, google does this on it's homepage.

Burlingame answered 26/10, 2013 at 17:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.