title: twisted websocket chatserver openid authentication
body: <p>i have a python chatserver that uses twisted and autobahn websockets for connection.</p>
  
  <pre><code>factory = MessageServerFactory("ws://localhost:9000", debug=debug, debugCodePaths=debug)
  factory.protocol = MessageServerProtocol
  factory.setProtocolOptions(allowHixie76=True)
  listenWS(factory)
  </code></pre>
  
  <p>this is the server</p>
  
  <pre><code>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
  </code></pre>
  
  <p>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. </p>
  
  <p>this is the onload function:</p>
  
  <pre><code>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);
      }
  }
  </code></pre>
  
  <p>as i'm new to python/twisted i don't know how to do this and examples mostly show only websocket chatroom without authentification. </p>
  
  <p>how can i implement openid properly? as it also requires redirection, which would break the ws connection.</p>